文章

Ruby on Rails 数据库动态重连

介绍如何在 Ruby on Rails 中实现数据库的动态重连

在 Ruby on Rails 中,当数据库连接意外中断时,动态重连可以帮助确保应用程序的稳定性。以下是实现数据库动态重连的代码示例和说明。

实现动态重连

可以在 Rails 的初始化配置中添加以下代码,以便在 MySQL 适配器发生连接丢失时自动重连。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Rails.application.config.after_initialize do
  config = ActiveRecord::Base.configurations[Rails.env] ||
              Rails.application.config.database_configuration[Rails.env]

  adapter = config['adapter']

  if adapter == "mysql2"
    module ActiveRecord::ConnectionAdapters
      class Mysql2Adapter
        alias_method :execute_without_retry, :execute

        def execute(*args)
          execute_without_retry(*args)
        rescue ActiveRecord::StatementInvalid => e
          if e.message =~ /server has gone away/i ||
             e.message =~ /Lost connection to MySQL server during query/i
            reconnect!
            retry
          else
            raise e
          end
        end
      end
    end
  end
end

其他重连方式

除了在适配器中实现重连外,您还可以通过以下方式手动触发重连:

1
2
3
4
5
# 手动重连当前模型的连接
model.connection.reconnect!

# 手动重连 ActiveRecord 的基础连接
ActiveRecord::Base.connection.reconnect!

说明

  • 通过重写 execute 方法,我们可以捕获 ActiveRecord::StatementInvalid 异常,检查错误消息是否表明连接丢失。如果是,我们调用 reconnect! 方法来重新连接数据库。
  • retry 语句使得在重新连接后可以重新执行原始查询。

结论

动态重连机制可以极大地提高 Rails 应用的鲁棒性,确保即使在数据库连接不稳定的情况下,应用仍能继续正常工作。

本文由作者按照 CC BY 4.0 进行授权