我开发了一个带GWT的网络应用程序。我只创建一个EntityManagerFactory(单例),但我不知道何时必须关闭它。我已按照此网站的说明进行操作: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循环。
提前致谢。
答案 0 :(得分:2)
错误消息由它自己说话
从服务器成功收到的最后一个数据包是44,115,64 4 几毫秒之前。成功发送到服务器的最后一个数据包是 44,115,644毫秒前。比配置的服务器更快 'wait_timeout'的值。你应该考虑到期和/或 在您的应用中在使用前测试连接有效性, 增加服务器配置的客户端时间值或使用 Connector / J连接属性'autoReconnect = true'以避免这种情况 问题
推荐的方法是使用管理过期连接的c3p0 connection pool。
Hibernate Documentation
但是,Hibernate自己的连接池算法非常简单 简陋。它旨在帮助您入门,而不是 打算用于生产系统,甚至用于性能 测试。您应该使用第三方池以获得最佳性能 稳定性。只需替换hibernate.connection.pool_size属性即可 具有连接池特定设置。这将关闭Hibernate的 内部游泳池。例如,您可能想使用c3p0。
在MYSQL参考文档中,建议不要使用autoReconnect
属性。
Connector/J autoReconnect
驾驶员是否应该尝试重新建立陈旧和/或死亡的连接? 如果启用,驱动程序将为发出的查询抛出异常 陈旧或死亡的连接,属于当前交易, 但会在下一个查询发出之前尝试重新连接 新交易中的连接。使用此功能不是 建议,因为它有与会话状态和。相关的副作用 应用程序不处理SQLExceptions时的数据一致性 正确,并且只在您无法使用时使用 配置您的应用程序以处理由死亡导致的SQLExceptions 和陈旧的连接正确。或者,调查设置 MySQL服务器变量“wait_timeout”到某个高值而不是 默认为8小时。