JAVA JPA persistence.xml - 如何在我的应用程序中使用之前测试连接有效性
Posted
技术标签:
【中文标题】JAVA JPA persistence.xml - 如何在我的应用程序中使用之前测试连接有效性【英文标题】:JAVA JPA persistence.xml - how to test connection validity before use in my application 【发布时间】:2014-07-17 02:00:10 【问题描述】:我使用 Google Guice Persist ( JPA ) 来操作数据。我的 Web 应用程序位于 Jetty 服务器上。以下是我的persistence.xml:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="MyJpaUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>my.api.repository.entity.Foo</class>
<shared-cache-mode>NONE</shared-cache-mode>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://127.0.0.1/testing?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true" />
<property name="javax.persistence.jdbc.user" value="test_account" />
<property name="javax.persistence.jdbc.password" value="test_pwd" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="false"/>
<property name="format_sql" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="false" />
<property name="hibernate.c3p0.max_size" value="30" />
<property name="hibernate.c3p0.min_size" value="5" />
<property name="hibernate.c3p0.acquire_increment" value="1" />
<property name="hibernate.c3p0.idle_test_period" value="300" />
<property name="hibernate.c3p0.max_statements" value="0" />
<property name="hibernate.c3p0.timeout" value="100" />
<property name="hibernate.c3p0.preferredTestQuery" value="SELECT 1" />
<property name="hibernate.c3p0.testConnectionOnCheckout" value="true" />
</properties>
</persistence-unit>
</persistence>
我的应用程序空闲时出现以下错误:
[c3p0] 发生另一个错误 [com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功接收的最后一个数据包是 49,492,938 毫秒前。最后一个成功发送到服务器的数据包是在 49,492,938 毫秒前。比服务器配置的“wait_timeout”值长。您应该考虑在应用程序中使用之前使连接有效性过期和/或测试,增加客户端超时的服务器配置值,或使用连接器/J 连接属性“autoReconnect=true”来避免此问题。 ] 不会向听众报告!
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功接收到的最后一个数据包是 49,492,938 毫秒前。最后一个成功发送到服务器的数据包是在 49,492,938 毫秒前。比服务器配置的“wait_timeout”值长。您应该考虑在应用程序中使用之前使连接失效和/或测试连接有效性,增加客户端超时的服务器配置值,或使用 Connector/J 连接属性“autoReconnect=true”来避免此问题。
如何配置persistence.xml 以避免这个问题? 谢谢。
【问题讨论】:
不熟悉 c3p0,但在其他池中,您必须指定一个“testQuery”,它会定期运行以检查连接是否仍然存在。 您好 Thilo,感谢您的回复。我添加了“testQuery”,但它仍然不起作用。我已经更新了上面的配置。 【参考方案1】:我遇到过这个问题。这个问题的原因是未封闭的实体管理器。每当您在 db 上执行某些操作时,请创建一个新的实体管理器,然后关闭实体管理器。
【讨论】:
以上是关于JAVA JPA persistence.xml - 如何在我的应用程序中使用之前测试连接有效性的主要内容,如果未能解决你的问题,请参考以下文章