БД, размещенная на 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
в качестве альтернативы для любой проблемы, вместо этого было бы лучше включить управление соединением в бизнес-логику, чтобы управлять открытием / закрытием соединения каждый раз, когда вам нужно. Возможно, пул соединений может вам помочь.
Я имею в виду, когда вы вызываете бизнес-метод из своего пользовательского интерфейса (не имеет значения, веб это, рабочий стол, настольный компьютер и т. Д.), Вы должны управлять открытым соединением и начинать транзакцию (и другие сквозные проблемы, такие как авторизация, аудит, журнал,...). В течение всей бизнес-логики контролируйте возможные исключения, фиксируйте или откатывайте и освобождайте ресурсы.
Если вы разместите некоторый код, вы получите более конкретные ответы.
Надеюсь, поможет!