Управление EntityManagerFactory в веб-приложении - PullRequest
2 голосов
/ 20 сентября 2011

Я разработал веб-приложение с GWT. Я создаю только один EntityManagerFactory (singleton), но я не знаю, когда мне нужно его закрыть. Я следовал инструкциям на этом сайте: http://javanotepad.blogspot.com/2007/05/jpa-entitymanagerfactory-in-web.html, но через 8 часов, не заходя в приложение, у меня появляется ошибка:

    78616509 [http-9080-Processor4] ERROR org.hibernate.transaction.JDBCTransaction - JDBC begin failed
com.mysql.jdbc.CommunicationsException: The last packet successfully received from the server was 44,115,64
4 milliseconds ago.  The last packet sent successfully to the server was 44,115,644 milliseconds ago. is lo
nger than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing
 connection validity before use in your application, increasing the server configured values for client tim
eouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1112)

После 2 или 3 попыток все работает нормально. Если я закрываю EntityManagerFactory после каждой транзакции, у меня нет проблем, но я не хочу этого делать. Я хочу знать, как я могу управлять циклом EntityManagerFactory.

Заранее спасибо.

1 Ответ

2 голосов
/ 21 сентября 2011

Сообщение об ошибке говорит само за себя

Последний пакет, успешно полученный от сервера, был 44,115,64 4 миллисекунды назад Последний пакет успешно отправлен на сервер 44,115,644 миллисекунд назад. меньше настроенного сервера значение 'wait_timeout'. Вы должны рассмотреть возможность истечения срока действия и / или проверка правильности подключения перед использованием в вашем приложении, увеличение значений, настроенных сервером для времени ожидания клиента, или использование Свойство соединения Connector / J 'autoReconnect = true' , чтобы избежать этого проблема.

Рекомендуется использовать пул соединений c3p0 , который управляет соединениями с истекшим сроком действия.

Документация Hibernate
Собственный алгоритм пула соединений Hibernate, однако, довольно в зачаточном состоянии. Он призван помочь вам начать работу и не предназначен для использования в производственной системе или даже для производительности тестирование. Вы должны использовать сторонний пул для лучшей производительности и стабильность. Просто замените свойство hibernate.connection.pool_size с конкретными настройками пула соединений. Это отключит Hibernate's внутренний бассейн. Например, вы можете использовать c3p0.

В справочной документации MYSQL не рекомендуется использовать свойство autoReconnect.

Разъем / J AutoReconnect
Должен ли водитель попытаться восстановить устаревшие и / или поврежденные соединения? Если этот параметр включен, драйвер выдаст исключение для запросов, выполненных на устаревшее или мертвое соединение, принадлежащее текущей транзакции, но попытается переподключиться до следующего запроса на соединение в новой транзакции. Использование этой функции не рекомендуется, потому что он имеет побочные эффекты, связанные с состоянием сеанса и согласованность данных, когда приложения не обрабатывают SQLExceptions правильно, и предназначен только для использования, когда вы не можете настройте ваше приложение для обработки SQLExceptions, возникающих из-за мертвых и устаревшие соединения правильно. В качестве альтернативы, исследуйте настройку Серверная переменная MySQL "wait_timeout" в какое-то высокое значение, а не по умолчанию 8 часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...