JAVA JPA persistence.xml - 如何在我的应用程序中使用之前测试连接有效性

时间:2014-05-28 01:39:05

标签: jpa jdbc timeout persistence

我使用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&amp;zeroDateTimeBehavior=convertToNull&amp;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毫秒。比服务器配置的值&#39; wait_timeout&#39;更长。您应该考虑在应用程序中使用之前过期和/或测试连接有效性,增加服务器配置的客户端超时值,或者使用Connector / J连接属性&quot; autoReconnect = true&#39;避免这个问题。 ]不会向听众报告!

     

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功收到的最后一个数据包是49,492,938毫秒。成功发送到服务器的最后一个数据包是49,492,938毫秒。比服务器配置的值&#39; wait_timeout&#39;更长。您应该考虑在应用程序中使用之前过期和/或测试连接有效性,增加服务器配置的客户端超时值,或者使用Connector / J连接属性&quot; autoReconnect = true&#39;避免这个问题。

如何配置persistence.xml以避免此问题? 感谢。

1 个答案:

答案 0 :(得分:1)

我遇到过这个问题。这个问题的原因是未公开的实体经理。每当你在db上执行某些操作时,请创建一个新的实体管理器,然后关闭实体管理器。