我有两个主题。在一个线程中,我从数据库中获取一条记录作为ActiveRecord对象。然后我从另一个线程访问该对象。
这种用法有问题吗? 如果两个线程使用与DB的单独连接,如果需要访问AR对象的关联,将使用哪个连接?
我在StackOverflow上看到了一些关于通过ActiveRecord从不同线程连接到数据库的缺陷以及需要手动签入此类连接的问题。这会对这个问题产生影响吗?
答案 0 :(得分:1)
你听错了。当使用AR时,你可能会发现你需要以奇怪的方式绕过线程以保持稳定...如果你有保证你只有2个线程,那么你就是'至少就AR来说可能是安全的。 (当然,并发的所有其他陷阱 - 例如死锁,线程饥饿等 - 仍然适用,因此请务必考虑到这些。)
要记住的一件事是每个线程都将使用它的AR连接,因此database.yml中的pool
字段必须足够高以容纳所有线程。如果您正在使用像Puma这样基于线程的网络服务器,那么这可能会变得更加复杂......如果您对rails更新,我会在处理线程和AR时要小心。它可能是一个很大的兔子洞。
一个线程获取对象的目的是什么,另一个访问它的目的是什么?如果你期望真正的速度优势,那么它可能是值得的,但由于第二个线程的活动(AR记录上的操作)取决于第一个线程的结果,(加载AR记录)然后你可能看不到速度提升,因为您需要等待第一个线程完成甚至开始使用第二个线程。如果您的方案在加载对象之后没有对第一个帖子做任何事情,我绝对建议不要这样做,因为您不会看到任何速度改进,但我不会知道整个场景,使用线程可能仍然适合你的情况。
所以简而言之,没有什么可以阻止你使用带有AR的线程,但它有风险,你可以预期在奇怪的地方出现bug,除非你的线程使用是保守的。 可能对您的应用仍有意义,但请先查看其他解决方案,如果您选择线程,请谨慎行事。
重新"如果两个线程使用与DB的单独连接,则在需要访问AR对象的关联时将使用哪个连接":每个线程获取其自己的AR连接,因此访问AR关联的线程将使用自己的连接,而不管最初加载AR记录的线程。
在您的应用中使用线程的动机是什么?处理事情可能会更好。