gpt4 book ai didi

sql - 数据库停机后如何使Rails自动重新建立数据库连接

转载 作者:行者123 更新时间:2023-12-03 20:56:55 25 4
gpt4 key购买 nike

数据库停机后,Rails会首先抛出以下错误:


ActiveRecord :: StatementInvalid:NativeException:
org.postgresql.util.PSQLException:连接被拒绝。检查
主机名和端口正确并且邮局主管正在接受
TCP / IP连接。


从那时起,即使备份了数据库,每个具有的数据库调用也会出现以下错误:


ActiveRecord :: StatementInvalid:ActiveRecord :: JDBCError:这
连接已关闭。


为了使服务器再次运行,我必须重新启动Rails服务器。这对我们来说并不理想,因为我们的产品工程师希望对数据库进行维护,而不必恢复依赖于数据库的所有服务。因此,我想知道-是否有一种方法可以自动让Rails尝试重新建立数据库连接,或者建议一种获得此行为的方法?

我尝试过的事情:

我已经尝试在数据库选项中将reconnect设置为true,这样我就可以终止单个数据库连接,而rails将重新建立连接。但是,它不会在数据库中断后出现。我发现从命令控制台可以通过调用恢复连接


ActiveRecord :: Base ::建立连接


所以也许找到一个干净的地方让铁轨调用上面的命令,这行得通吗?有什么建议?

最佳答案

这是一个非常丑陋的解决方案,但我认为它应该起作用。


就像以前一样,将reconnect设置为true。
编辑文件activerecord-X.Y.Z/lib/active_record/connection_adapters/postgresql_adapter.rb并将reconnect!方法更改为

def reconnect!
clear_cache!
ActiveRecord::Base.establish_connection
end



需要更多的研究


检查它是否真的有效
检查它是否不会同时多次调用Establishment_connection(在这种情况下,您需要锁)
检查是否有放置此代码的更好的位置。Ruby使您可以在运行时重新定义任何方法,但需要加载符号。换句话说,您需要PostgreSQLAdapter类存在。我最接近加载该符号的地方是在 config/environment.rb之后的 initialize!中,但是它在堆栈中的深度仍然不足以加载该符号。


如果确实在ActiveRecord代码之外找到一个已经加载了符号的位置,并且可以编辑其方法,则将以下代码放入其中:

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::StatementPool
def reconnect!
clear_cache!
ActiveRecord::Base.establish_connection
end
end


更重要的是,实际上调用 establish_connection有点矫kill过正。可以在该方法中调用重要的东西,以避免一些开销。

让我知道这是否有帮助,以及您是否取得了任何进展。

关于sql - 数据库停机后如何使Rails自动重新建立数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12469094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com