У меня есть ruby script, который требует "mysql2" и использует запросы запроса для 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>'
script на моем Ubuntu в порядке, однако моя производственная среда - CentOS, и там я установил MySQL из исходного кода. В моем приложении Rails есть ОК, и для него также требуется "mysql2", но когда я запускаю этот script, он терпит неудачу.
Я думаю, что проблема связана с my.cnf, но я не знаю, как настроить его.
Драйвер mysql2 предоставляет вариант для reconnect в MySQL в случае, если соединение уходит. Вместо того, чтобы обновлять файл my.cnf, обновите файл gem database.yml, чтобы включить
reconnect: true
вариант. Это гарантирует, что камень mysql2 попытается снова подключиться к MySQL.
вы вызываете метод .query непосредственно на объект @db... что именно этот объект?
Я имею в виду... если вы находитесь под Rails, вы должны вызывать запросы типа:
result = ActiveRecord::Base.connection.execute("sql here")
Я думаю, что это может быть причиной, потому что Rails управляет пулом соединений (например, 5 установленных подключений и каждый запрос переходит к одному из них на основе запросов).
В любом случае, если это не причина, то может быть, что ваш gem mysql2 скомпилирован с другой версией библиотеки libmysqlclient.so в системе... Затем, когда вы пытаетесь выполнить запрос, он внутренне выдает ошибку о несовместимом протоколе и отключает...
Пожалуйста, проверьте, что ваши файлы libmysqlclient.so и его заголовочные файлы имеют одну и ту же версию... Или, если у вас больше версий версий не установлено... а затем попробуйте перекомпилировать gem mysql2.
Надеюсь, это поможет. С уважением, NoICE