首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何自动重新连接Rails 6 PostgreSQL连接?

如何自动重新连接Rails 6 PostgreSQL连接?
EN

Stack Overflow用户
提问于 2020-11-19 21:23:26
回答 1查看 1.6K关注 0票数 7

我有一个带有一些辅助进程的rails 6应用程序。该应用程序使用PostgreSQL作为DB。有时DB重新启动(例如,小版本升级),而工作人员失去了连接。我希望他们能自动重新连接,但这没有发生。

我试图在reconnect: true中使用database.yml标志。同样的故事。我仍然收到PG::UnableToSend: no connection to the server。该选项甚至在PostgresqlAdapter中都不可用。我想这只是MySQL适配器选项。

这些工作人员是我使用rails runner运行的简单服务类。

我们能做些什么?我相信答案一定很简单。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-10 22:00:41

我为PG自动重新连接做了一个ActiveRecord补丁。

异常工作可以优化,但我有一些奇怪的混合了PG::UnableToSendPG::ConnectionBadPG::Error,所以我比较异常名称。

代码语言:javascript
复制
module PostgreSQLAdapterAutoReconnectPatch
  QUERY_EXCEPTIONS = [
    "SSL connection has been closed unexpectedly",
    "server closed the connection unexpectedly",
    "no connection to the server",
  ].freeze

  CONNECTION_EXCEPTIONS = [
    "could not connect to server",
    "the database system is starting up",
  ].freeze

  def exec_query(*args)
    super(*args)
  rescue ActiveRecord::StatementInvalid => e
    raise unless recoverable_query?(e.message)

    in_transaction = transaction_manager.current_transaction.open?
    try_reconnect
    in_transaction ? raise : retry
  end

  private

  def recoverable_query?(error_message)
    QUERY_EXCEPTIONS.any? { |e| error_message.include?(e) }
  end

  def recoverable_connection?(error_message)
    CONNECTION_EXCEPTIONS.any? { |e| error_message.include?(e) }
  end

  def try_reconnect
    sleep_times = [0.1, 0.5, 1, 2, 4, 8, 16, 32]

    begin
      reconnect!
    rescue PG::Error => e
      sleep_time = sleep_times.shift
      if sleep_time && recoverable_connection?(e.message)
        logger.warn("DB Server timed out, retrying in #{sleep_time} sec")
        sleep sleep_time
        retry
      else
        logger.error(e)
        raise
      end
    end
  end
end

require "active_record/connection_adapters/postgresql_adapter"
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(PostgreSQLAdapterAutoReconnectPatch)

灵感来自

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64920233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档