Тайм-аут / разрыв соединений с MySQL в приложении JRuby on Rails на Jetty - PullRequest
1 голос
/ 02 октября 2009

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

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

StackTrace:

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

** НАЧИНАЕТСЯ ИСКЛЮЧИТЬ **

java.io.EOFException

StackTrace:

java.io.EOFException на com.mysql.jdbc.MysqlIO.readFully (MysqlIO.java:1913) на com.mysql.jdbc.MysqlIO.reuseAndReadPacket (MysqlIO.java:2304) at 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, чтобы убедиться, что соединения поддерживаются или перерабатываются должным образом, но мне нужна помощь, чтобы выяснить, где искать. Кто-нибудь может предоставить мне детали?

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

Ответы [ 2 ]

1 голос
/ 13 октября 2009

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

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

1 голос
/ 09 октября 2009

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

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

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

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

...