БД, размещенная на MySQL, через некоторое время приложение зависает

Я запускаю Java-программу и пытаюсь использовать ее с размещенной БД, я запускаю Vserver Ubuntu 12.04 с Mysql, полный root-доступ.

Я изменил my.cnf иметь больше ресурсов. Когда я запускаю приложение, оно быстро, почти без разницы с локальной базой данных.

Моя проблема в том, что через некоторое время простоя программа зависает, вероятно, из-за разрыва соединения. В журнале ошибок нет записей. Если я убиваю приложение и перезапускаю его, оно снова работает, ничего кроме уничтожения не работает, это linuxPC.

я использовал ?autoReconnect=true но я не уверен, что это правильно, таблицы innodb.

У кого-нибудь есть идеи, как избежать разрыва соединения или как сделать переподключение?

PS [17.12.2015]?autoReconnect=true был удален

сегодня я получил некоторые детали после долгого ожидания

com.openbravo.basic.BasicException: 
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 2.435.471 milliseconds ago.  The last packet sent successfully to the server was 959.832 milliseconds ago.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 
Communications link failure

The last packet successfully received from the server was 2.435.471 milliseconds ago.  The last packet sent successfully to the server was 959.832 milliseconds ago.

java.net.SocketException: 

Это то, что происходит, когда wait_timeout слишком короткий? После "ошибки" программа снова заработала!

2 ответа

Автосоединение опасно для InnoDB. Когда соединение теряется в середине транзакции, предыдущие действия в транзакции откатываются. Но код продолжает работать так, как будто транзакция продолжается. Это может привести к тому, что последующие записи будут несовместимы с данными отката.

Вам лучше распознать потерянное соединение и перезапустить транзакцию.

Вашему вопросу не хватает конкретной информации, но я думаю, что произойдет. MySQL Server имеет параметр под названием wait_timeout (См. Официальный документ).

Когда у вас есть connection превышающий этот тайм-аут, MySQL закроет его, и если вы не будете правильно управлять SQLExceptions, у вашего приложения будут проблемы.

Вы можете попытаться увеличить wait_timeout или просмотрите код подключения, чтобы управлять исключениями, но оба являются обходными путями.

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

Я имею в виду, когда вы вызываете бизнес-метод из своего пользовательского интерфейса (не имеет значения, веб это, рабочий стол, настольный компьютер и т. Д.), Вы должны управлять открытым соединением и начинать транзакцию (и другие сквозные проблемы, такие как авторизация, аудит, журнал,...). В течение всей бизнес-логики контролируйте возможные исключения, фиксируйте или откатывайте и освобождайте ресурсы.

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

Надеюсь, поможет!

Другие вопросы по тегам