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

Ruby ActiveRecord:如何在连接断开时自动重新连接到PostgreSQL?,ruby,postgresql,activerecord,sinatra,Ruby,Postgresql,Activerecord,Sinatra,我正在将ActiveRecord与Sinatra和PostgreSQL一起使用。当数据库连接断开时(由于临时网络故障或postgres服务器重新启动),我的应用程序不会自动重新获取连接。我必须重新启动应用程序才能再次连接到postgres。我记得我在另一个项目中使用Rails时没有这个问题 我需要添加一些配置或代码来告诉ActiveRecord自动重新连接到PostgreSQL吗?来自 如果在Rails外部使用活动记录,或者至少在控制器操作外部使用活动记录,则在执行数据库语句之前,必须自己验证连

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

我需要添加一些配置或代码来告诉ActiveRecord自动重新连接到PostgreSQL吗?

来自

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

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


这篇博文是关于重新连接到MySQL的,但我猜不管使用什么引擎,它都是一样的,因为它是抽象出来的。博客还提到了配置中的重新连接选项,但您必须了解这是否适用于Postgres。

ActiveRecord::Base.verify\u active\u connections早在2012年就已在rails commit 9d1f1b1ea9e5d637984fda4f276db77ffd1dbdcb中删除。所以我们不能用那种方法

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

所以,也许你们(和我,我和你们有同样的情况)必须返回到池的连接

并使用ActiveRecord::ConnectionAdapters::ConnectionManagement将连接作为动作包的请求处理周期返回到sinatra中的池

use ActiveRecord::ConnectionAdapters::ConnectionManagement
然后,正如rails commit 9d1f1b1ea9e5d637984fda4f276db77ffd1dbdcb中所述,我们使用的是一种不同的方式
,在使用
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

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

ActiveRecord::Base.clear_active_connections!

ActiveRecord将在下一次查询时重新连接。也可以从Rails控制台工作,这非常方便

我有完全相同的症状。但是
ActiveRecord::Base.verify\u active\u连接随rails commit 9D1B1E一起消失。
  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
ActiveRecord::Base.clear_active_connections!