ActiveRecord:当连接断开时如何自动重新连接到PostgreSQL?

时间:2014-10-02 16:54:16

标签: ruby postgresql activerecord sinatra

我正在使用ActiveRecord和Sinatra以及PostgreSQL。当数据库连接中断(由于临时网络故障或postgres服务器重新启动)时,我的应用程序不会自动重新获取连接。我必须重新启动应用才能再次连接到postgres。我记得当我在另一个项目中使用Rails时,我没有遇到这个问题。

我是否需要放置一些配置或代码来告诉ActiveRecord自动重新连接到PostgreSQL?

3 个答案:

答案 0 :(得分:1)

ActiveRecord::Base.verify_active_connections!已于2012年在rails commit 9d1f1b1ea9e5d637984fda4f276db77ffd1dbdcb中删除。所以我们不能使用那种方法。

以下句子是我的简短调查结果。我不是rails activerecord的专家。所以要谨慎听。 (但希望这有帮助)

comment in connection_pool.rb

  # 1. Simply use ActiveRecord::Base.connection as with Active Record 2.1 and
  #    earlier (pre-connection-pooling). Eventually, when you're done with
  #    the connection(s) and wish it to be returned to the pool, you call
  #    ActiveRecord::Base.clear_active_connections!. This will be the
  #    default behavior for Active Record when used in conjunction with
  #    Action Pack's request handling cycle.

所以也许你(和我有同样的情况就像你一样)必须返回池连接。

并以Action Pack's request handling cycle的形式返回sinatra中池的连接,使用ActiveRecord :: ConnectionAdapters :: ConnectionManagement

use ActiveRecord::ConnectionAdapters::ConnectionManagement

然后如rails commit 9d1f1b1ea9e5d637984fda4f276db77ffd1dbdcb中所述,我们在this line中使用a different way,在使用checkout_and_verify时始终Basae.connection遵守动作包生命周期。

  def connection
    # this is correctly done double-checked locking
    # (ThreadSafe::Cache's lookups have volatile semantics)
    @reserved_connections[current_connection_id] || synchronize do
      @reserved_connections[current_connection_id] ||= checkout
    end
  end

答案 1 :(得分:0)

来自https://www.new-bamboo.co.uk/blog/2010/04/11/automatic-reconnection-of-mysql-connections-in-active-record/

  

如果在Rails之外使用Active Record或至少在控制器外部操作,则必须在执行数据库语句之前自行验证连接。这可以使用以下代码完成:

ActiveRecord::Base.verify_active_connections!
  

由于Active Record每个线程使用一个连接,因此在多线程应用程序中,必须分别对每个线程执行此验证。

博客文章是关于重新连接到MySQL,但我猜它无论使用什么引擎都会是相同的,因为它被抽象掉了。该博客还提到配置中的重新连接选项,但您必须找出是否适用于Postgres。

答案 2 :(得分:0)

已更新2019-01-11从Rails 4.2开始我必须使用

ActiveRecord::Base.clear_active_connections!

,ActiveRecord将在下一次查询时重新连接。也可以从Rails控制台运行,这很方便