Ruby on Rails - Mysql2::Error:由于不活动,客户端被服务器断开连接

Ruby on Rails - Mysql2::Error: The client was disconnected by the server because of inactivity

提问人:Mohsin Sethi 提问时间:8/28/2023 最后编辑:Holger JustMohsin Sethi 更新时间:8/29/2023 访问量:96

问:

我已经将我的 Ruby on Rails 项目 Ruby 版本从 2.5.8 升级到 3.0.6。我的 Ruby on Rails 版本是 6.1.7.6。在我升级了 Ruby 版本后,现在我在使用 Rails 控制台时遇到了很多以下错误。Ruby v2.5.8 并非如此。使用该应用程序时似乎不会发生这种情况,但仅从控制台发生。

/usr/local/bundle/gems/mysql2-0.5.5/lib/mysql2/client.rb:151:in `_query': Mysql2::Error: The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior. (ActiveRecord::StatementInvalid)
/usr/local/bundle/gems/mysql2-0.5.5/lib/mysql2/client.rb:151:in `_query': The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior. (Mysql2::Error)

这是我database.yml

defaults: &defaults
  adapter: mysql2
  wait_timeout: 30 
  timeout: 500
  reconnect: true
  strict: false
  host: somehostname
  port: someportnumber
  username: someusername
  password: somepassword
  database: somedatabasename
  encoding: utf8mb4
  collation: utf8mb4_unicode_ci
  pool: 13

development:
  primary:
    <<: *defaults
  shard1:
    <<: *defaults
    database: shard1
  shard2:
    <<: *defaults
    database: shard2
  

我尝试将mysql2 gem从0.5.5降级到0.5.4,但它没有解决问题。此外,我试图增加database.yml但这似乎也无法解决问题。database.yml中的选项似乎不再起作用。timeoutreconnect

MySQL 的Ruby-on-Rails Ruby

评论


答:

0赞 abdollar 8/29/2023 #1

这是database.yml中 30 秒的wait_timeout设置。wait_timeout是 。默认情况下,mysql2 gem 是一个非交互式客户端(除非您使用 CLIENT_INTERACTIVE 显式构建它)。也许删除该设置,默认的 8 小时似乎是合理的。The number of seconds the server waits for activity on a noninteractive connection before closing itwait_timeout

评论

0赞 Mohsin Sethi 8/29/2023
但是,我想知道为什么在将 Ruby 版本升级到 3.0.6 后它开始发生。在 v2.5.8 上根本没有发生完全相同的database.yml。
0赞 abdollar 8/31/2023
升级 ruby 可能在某个地方减慢了速度。检查您从 v2 到 v3 的启动时间,如果它在 v3 中较慢,这解释了您为什么看到这个问题,否则我没有一个很好的解释,如果代码完全相同并且只有 ruby 发生了变化,但我怀疑情况是否如此,一定有什么东西发生了变化并减慢了速度。