Rails Rails 连接 MySQL 数据库问题

whjwssy2017 · 2017年12月13日 · 最后由 a0nqm 回复于 2017年12月18日 · 3320 次阅读

近日,维护一个 ror 框架搭建的网站。有时页面访问会出现 internal error(redmine 500)的错误。正常情况,刷新一下,页面就正常了,有时刷新也不行,一直处于加载状态,只能重启 apache。 报错日志显示:连接被重置

(报错报到了 ruby-mysql.gem 里面的 write 函数,显示在 sock.flush 的时候超时)

mysql 数据库不在本地,连接的是远程云数据库

数据库的 wait_timeout 值为 400s,write_timeout 为 60s vendor 文件夹 里面的连接池 size 是 5,连接池的 wait_timeout 是 5s,mysql 数据库驱动安装的是 mysql-2.8.1gem(没有用 mysql2) 造成以上原因是因为 socket 超时断掉了,链接失效,但客户端仍发起请求就报 500 了吗?可以通过修改 socket 连接机制修复吗? 我在代码里看到数据库配置有 reconnet 属性,默认为 false,我在 database.yml 里面配置,设为 true 也不行。vendor 文件夹里面 rails 的东西,ruby-mysql 也不敢改. ruby 版本是 1.8.7 的,rails 是 2.3.5,老网站,版本非常旧。

希望有大神指点迷津= =困扰好久的问题

里面的连接池 size 是 5,连接池的 wait_timeout 是 5s

测试一下是不是你同时发起 10 个请求,然后执行后是不是有几个请求被 reset.

可以尝试把 database.yml 中 pool 设置为 20,然后再发起 10 请求查看一下,之后再改为 50,试一下。

awking 回复

测试环境上,只有我自己访问,但有时候也会出现 internal error 的错误。 连接失效过后,不会有重连的机制吗?在请求之前,不会确定连接是否有效吗?

awking 回复

我是不是不可以修改 vendor/rails 里面的代码,要不然一升级都白费了。 我修改过 pool size,没有效果。 不知道用不用换一个驱动器试一试,之前用的 mysql.gem,换一个 mysql2 试试?

whjwssy2017 回复

我记得以前看过一些东西,上面介绍说推荐使用 mysql2(而不是 mysql gem)。

在所见过的项目里用到 MySQL 的也都是用的 mysql2,你换一下试试看吧。

a0nqm 回复

我换成了 mysql2,我的 rails 是 2.3.5 的,特别低。 我在 vendor/rails/activerecord/lib/active_record/connection_adapters 里面看到只有 mysql_adapter.rb,但我发现 rails3.1.0 以后的文件中,都有一个 mysql2_adapter 文件。 为什么 rails2 里面没有呢?我只是在修改 database.yml、gem install mysql2 之后 gem activerecord_mysql2_adapter 了

a0nqm 回复

rails2.3.5

rails3.1.0

更换 mysql2 之后,到目前为止,上述 500 内部错误问题,都没有出现!

whjwssy2017 回复

Rails 2.3.5 很古老了... 我没有用过,不过这样子没事就好了~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号