ActiveRecord::StatementInvalid: NativeException:
org.postgresql.util.PsqlException: Connection refused. Check that the
hostname and port are correct and that the postmaster is accepting
TCP/IP connections.
从那时起,每个数据库调用都具有以下错误,即使在数据库备份之后:
ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: This
connection has been closed.
要使服务器再次运行,我必须重新启动rails服务器.这对我们来说不是理想的,因为我们的prod工程师希望对数据库进行维护,而不必备份依赖于数据库的所有服务.所以,我想知道 – 有没有办法自动获取Rails尝试重新建立数据库连接或推荐的方式来获得这种行为?
我试过的事情
我已经尝试在我的数据库选项中设置重新连接为true,因此,我可以杀死单个数据库连接,并且rails将重新建立连接.但是,数据库中断后不会.我发现从命令控制台我可以通过调用来恢复连接
ActiveRecord::Base::establish_connection
所以也许找到一个干净的地方为rails来调用上面的命令这将工作?有什么建议么?
解决方法
>将重新连接设置为true,就像您以前一样.
>编辑文件activerecord-X.Y.Z / lib / active_record / connection_adapters / postgresql_adapter.rb并更改重新连接!方法说
def reconnect! clear_cache! ActiveRecord::Base.establish_connection end
需要更多的研究
检查它是否实际工作
>检查它是否不会同时呼叫建立连接多次(在这种情况下你需要一个锁)
>检查是否有更好的地方放置这个代码.Ruby允许您在运行时重新定义任何方法,但您需要加载符号.换句话说,您需要PostgresqlAdapter类才能存在.最接近加载该符号的是在初始化后的config / environment.rb中,但在堆栈中仍然没有足够的深度来加载该符号.
如果您在ActiveRecord代码之外找到已经加载了该符号的地方,并且可以编辑其方法,然后将以下代码放在其中:
class ActiveRecord::ConnectionAdapters::PostgresqlAdapter::StatementPool def reconnect! clear_cache! ActiveRecord::Base.establish_connection end end
更重要的是,实际调用建立连接有点过分.可能会调用该方法中的重要内容,以避免一些开销.
让我知道这是否有帮助,如果你取得了进展.