>我有一个需要'mysql2'的ruby脚本,并使用查询语句来理解mysql,就像@db.query("SELECT sname,id FROM streets where region_id=#{region["id"]}")
但它总是像这样向我报告错误:
main.rb:261:in `query': MySQL server has gone away (Mysql2::Error)
from main.rb:261:in `block (3 levels) in <main>'
from main.rb:258:in `each'
from main.rb:258:in `block (2 levels) in <main>'
from main.rb:254:in `each'
from main.rb:254:in `block in <main>'
from main.rb:253:in `loop'
from main.rb:253:in `<main>'
我的 Ubuntu 上的脚本还可以,但是,我的生产环境是 CentOS,在那里我从源代码安装了 MySQL。我的 Rails 应用程序在那里运行正常,它还需要"mysql2",但是当我运行此脚本时它会失败。
我认为问题与my.cnf有关,但我不知道如何配置它。
mysql2 gem 提供了一个选项,可以在连接消失时重新连接到 MySQL。与其更新 my.cnf 文件,不如更新 gem 的 database.yml 文件以包含
reconnect: true
选择。这将确保 mysql2 gem 在需要时尝试重新连接到 MySQL。
你直接在对象@db上调用.query方法...这个物体到底是什么?
我的意思是。。。如果你在 Rails 下,你应该调用这样的查询:
result = ActiveRecord::Base.connection.execute("sql here")
我认为这可能是原因,因为 Rails 管理连接池(例如,5 个已建立的连接,每个查询都会根据请求转到其中一个)。
无论如何,如果这不是原因,那么可能是您的 mysql2 gem 是使用系统上不同版本的 libmysqlclient.so 库编译的......然后,当您尝试执行查询时,它会在内部抛出有关不兼容协议的错误并断开连接...
请检查您的 libmysqlclient.so 及其头文件是否为同一版本...或者,如果您没有安装它们的更多版本...然后请尝试重新编译 MySQL2 gem。
希望这有帮助。问候, NoICE