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