2010-03-22 4 views
1

Я получаю следующее исключение при выполнении первого PreparedStatement после определенного периода бездействия:В чем причина (и лечения) этого исключения Java Java?

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Связь отказа канала

Последний пакет успешно получил от сервер был 2,855,054 миллисекунды назад. Последний пакет, успешно отправленный на сервер, составлял 123 миллисекунды назад. на sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method) в sun.reflect.NativeConstructorAccessorImpl.newInstance (Unknown Source) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance (Unknown Source) в java.lang.reflect.Constructor.newInstance (Неизвестный источник) at com.mysql.jdbc.Util.handleNewInstance (Util.java:406) at com.mysql.jdbc.SQLError.createCommunicationsException (SQLError.java:1074) at com.mysql.jdbc.MysqlIO. reuseAndReadPacket (MysqlIO.java:3052) на com.mysql.jdbc.MysqlIO.reuseAndReadPacket (MysqlIO.java:2938) на com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3481) в com.mysql. jdbc.MysqlIO.sendCommand (MysqlIO.java:1959) на com.mysql.jdbc.MysqlIO.sqlQueryDirect (MysqlIO.java:2109) в com.mysql.jdbc.ConnectionImpl.execSQL (ConnectionImpl.java:2648) в com.mysql.jdbc.PreparedStatement.executeInternal (PreparedStatement. java: 2077) at com.mysql.jdbc.PreparedStatement.executeQuery (PreparedStatement.java:2228)

Это отображается только в том случае, если мое приложение недавно не общалось с MySQL. Последующие запросы выполняются нормально. Я подозреваю, что это какая-то проблема с тайм-аутом, но периоды бездействия ниже 8-часового тайм-аута для MySQL.

Любые предложения?

ответ

3

Вы используете пул соединений? Если это так, вы можете просто включить проверку/мониторинг пула соединений, чтобы каждый пользователь получал рабочее соединение MySQL. В большинстве пулов есть способ указывать SQL-файл с низким усилием для выполнения до того, как соединение заимствовано или иногда даже в фоновом режиме во время периодов простоя (для повышения производительности при риске возникновения некоторых плохих подключений к клиентским потокам).

Кроме того, w.r.t. время < 8-ий вопрос, делает ли MySQL бездействием из последнего полученного пакета или последнего значимого события (запрос и т. д.)? Я помню, как в коде драйвера MySQL был слышен сигнал сердечного ритма.

+0

Я не использую пул соединений, поскольку это казалось ненужным, но, возможно, я был неправ. Вы рекомендуете ли вы реализацию пула? – justkevin

+0

DBCP Apache (http: //commons.apache.org/dbcp /) довольно хорошо и включает в себя функциональность, которую вы ищете. Как положительный, так и отрицательный, он работает независимо от любых других программных компонентов, которые вы используете. Если вы работаете с сервером приложений любого типа, у него, вероятно, есть пул соединений, предварительно интегрированный вместе со событиями жизненного цикла (запустите мой пул, убейте мой пул). – ShabbyDoo

+0

После некоторого поиска я решил использовать c3p0, который, похоже, решил проблему. Спасибо за предложения. – justkevin

0

Я получаю следующее исключение при выполнении первого PreparedStatement после периода бездействия

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

Проверьте код, касающийся управления подключением к базе данных, и вы можете найти ответ. Хотя по таймауту MySQL значение таймаута составляет 8 часов - все еще возможно в вашем коде (или в чужом коде?), Соединение должно быть закрыто через некоторое время бездействия.

Смежные вопросы