在Web应用程序中管理EntityManagerFactory

时间:2011-09-20 13:35:23

标签: java hibernate gwt jdbc

我开发了一个带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循环。

提前致谢。

1 个答案:

答案 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小时。