如果我在调用Rails请求期间调用ActiveRecord :: Base.establish_connection来切换数据库,这种变化的影响有多全局?
答案 0 :(得分:0)
否(*),是,否。
我对Passenger不太熟悉,但我假设它的工作方式与其他每个Rails实例使用进程的容器一样。在这种情况下,每个人都有自己的连接。
连接在请求之间保持不变,因此如果您切换ActiveRecord类的连接,它将在下一个请求中使用。
最后,跨线程共享数据库连接。您可以通过以下方式验证:
Thread.new { puts ActiveRecord::Base.connection.object_id; sleep 30; puts ActiveRecord::Base.object_id}
sleep 10
ActiveRecord::Base.establish_connection
并且看到在建立连接的调用之前和之后输出的对象ID是不同的。
因此,如果您希望线程内的所有访问都访问相同的数据库连接,但是您将其中途切换到另一个线程内的不同连接,则可能会出现线程问题。