当Rails处理请求时更改全局变量或类变量时,效果的全局性如何?

时间:2011-07-17 01:58:27

标签: ruby-on-rails-3

如果我在调用Rails请求期间调用ActiveRecord :: Base.establish_connection来切换数据库,这种变化的影响有多全局?

  • 是否会影响在Passenger下运行的Rails应用的其他实例?
  • 它会影响同一个Rails实例的下一个请求吗?
  • 是否有任何线程竞争条件需要担心?

1 个答案:

答案 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是不同的。

因此,如果您希望线程内的所有访问都访问相同的数据库连接,但是您将其中途切换到另一个线程内的不同连接,则可能会出现线程问题。