Каковы последствия выполнения запроса к базе данных MySQL через Hibernate без запуска транзакции?

Мне кажется, что у нас есть некоторый код, который еще не запускает транзакцию для операций только для чтения, наши запросы через JPA/Hibernate, а также прямой SQL, похоже, работают. Сессия hibernate/jpa была бы открыта нашей платформой, но за несколько мест в устаревшем коде мы обнаружили, что транзакции не открывались.

Кажется, что в конечном итоге происходит то, что код обычно выполняется до тех пор, пока он не использует EntityManager.persist и EntityManager.merge. Однако иногда (возможно, 1/10) раза контейнер сервлета завершается с этой ошибкой...

Failed to load resource: the server responded with a status of 500 (org.hibernate.exception.JDBCConnectionException: The last packet successfully received from the server was 314,024,057 milliseconds ago.  The last packet sent successfully to the server was 314,024,057 milliseconds ago. is longer 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 timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.) 

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

К вашему сведению, это наш стек...

-Guice -Guice-Persist -Guice-Servlet -MySql 5.1.63 -Hibernate / C3P0 4.1.4.Final -Jetty

1 ответ

Да, я думаю.

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

Здесь, в моей компании, в прошлом у нас было много проблем с нетранзакционными запросами только для чтения, и мы адаптировали нашу среду для этого. Кроме того, мы поговорили с разработчиками BoneCP, и они согласились разработать набор функций, помогающих справиться с этой проблемой, таких как автоматический откат незавершенных транзакций, возвращаемых в пул, и распечатать стековую трассировку того, какой метод забыл зафиксировать транзакцию.

Этот вопрос обсуждался здесь: http://jolbox.com/forum/viewtopic.php?f=3&t=98

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