Время ожидания соединений MySQL истекает/отключается в приложении JRuby on Rails на Jetty

Мы запускаем приложение JRuby on Rails на Jetty, и, достигнув промежуточного сервера перед запуском, внезапно столкнулись с проблемой отказа от наших соединений JDBC. Вот прекрасная трассировка стека для иллюстрации:

Последний пакет, отправленный на сервер, был 12 мс назад.

ТРАССИРОВКИ СТЕКА:

com.mysql.jdbc.CommunicationsException: сбой канала связи из-за основного исключения:

** НАЧАТЬ ВЛОЖЕННОЕ ИСКЛЮЧЕНИЕ **

java.io.EOFException

ТРАССИРОВКИ СТЕКА:

java.io.EOFException в com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913) в com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304) в com.mysql.jdbc.MysqlIO.checkErrorPacket( MysqlIO.java:2803)

Из прочитанного я понял, что MySQL убивает наш пул соединений в течение определенного периода времени из-за бездействия (что имеет смысл, поскольку промежуточная подготовка сейчас находится под очень небольшой нагрузкой). Он работает под JRuby 1.3.1 со следующими драгоценными камнями:

activerecord-jdbc-адаптер (0.9.1) activerecord-jdbcmysql-адаптер (0.9.1) jdbc-mysql (5.0.4)

Я предполагаю, что мне, вероятно, нужно каким-то образом установить некоторую конфигурацию JDBC, чтобы гарантировать, что соединения поддерживаются или перерабатываются должным образом, но мне нужна помощь, чтобы узнать, где искать. Может ли кто-нибудь предоставить мне подробности?

Спасибо, Стив


person Steven Mohapi-Banks    schedule 02.10.2009    source источник


Ответы (2)


Это вероятно связано с wait_timeout. Вы можете попытаться увеличить его до чего-то очень большого, но это предполагает, что у вас есть административный доступ к серверу базы данных.

Я никогда не использовал JRuby или Rails. Но в «обычной» Java я бы решил эту проблему, используя пул соединений, который автоматически перезапускает незанятые соединения. Например, c3p0 имеет параметр maxIdleTime, который управляет этим.

РЕДАКТИРОВАТЬ: просто для удовольствия я выполнил поиск в Google по запросу «неактивное подключение ActiveRecord» и получил несколько результатов. Вот один из них: http://groups.google.com/group/sinatrarb/browse_thread/thread/54138bfedac59849

По-видимому, есть метод под названием ActiveRecord::Base.verify_active_connections!, который вы можете использовать. Я не даю никаких гарантий относительно этого решения :-). IANARP (я не программист Ruby).

person Matt Solnit    schedule 08.10.2009

Либо Rails, либо наш код ActiveRecord-JDBC, вероятно, должны обеспечивать периодическую проверку связи или разрыв соединения во время простоя. Соединения, отбираемые сервером, являются стандартным случаем, с которым должна справиться любая реализация пула соединений.

Я бы посоветовал сообщить об ошибке с помощью ActiveRecord-JDBC на kenai.com, но сначала спросить на JRuby ML, нашел ли кто-нибудь еще надежное решение для этой проблемы.

person Charles Oliver Nutter    schedule 13.10.2009