我正在使用ActiveRecord和Sinatra以及PostgreSQL。当数据库连接中断(由于临时网络故障或postgres服务器重新启动)时,我的应用程序不会自动重新获取连接。我必须重新启动应用才能再次连接到postgres。我记得当我在另一个项目中使用Rails时,我没有遇到这个问题。
我是否需要放置一些配置或代码来告诉ActiveRecord自动重新连接到PostgreSQL?
答案 0 :(得分:1)
ActiveRecord::Base.verify_active_connections!
已于2012年在rails commit 9d1f1b1ea9e5d637984fda4f276db77ffd1dbdcb中删除。所以我们不能使用那种方法。
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)
如果在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控制台运行,这很方便