我在AWS RDS下使用带有多-zo架构的Postgres数据库的Rails应用程序. RDS使用的HA架构是主/从,它们为服务提供指向当前主站的单个端点.
每当有数据库故障转移时,Active Record将继续尝试连接到同一服务器,而不是重试连接以获取主服务器的新IP.
有没有办法为ActiveRecord创建一个“全局”救援:: StatementInvalid:PG :: ConnectionBad:PQsocket()无法获得仅运行ActiveRecord :: Base.connection_pool.disconnect的套接字描述符错误!这将使下一个查询工作?
解决方法
通过对postgres_adapter应用猴子补丁,我能够在故障转移事件后重新连接Active Record.
LIB / core_ext / active_record / postgresql_adapter.rb:
require 'active_record/connection_adapters/postgresql_adapter' class ActiveRecord::ConnectionAdapters::PostgresqlAdapter private def exec_no_cache(sql,name,binds) log(sql,binds) { @connection.async_exec(sql,[]) } rescue ActiveRecord::StatementInvalid => e if e.to_s.include?('PG::ConnectionBad') ActiveRecord::Base.connection_pool.disconnect! end raise e end end