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&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 毫秒前。比服务器配置的“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 - 如何在我的应用程序中使用之前测试连接有效性的主要内容,如果未能解决你的问题,请参考以下文章

JPA的配置文件persistence.xml参数详解

Jpa规范中persistence.xml 配置文件解析

JPA 使用替代“persistence.xml”

没有persistence.xml的JPA

不在JPA 的 persistence.xml 文件中配置Entity class的解决办法

如何为 JPA 和 Hibernate 创建一个 persistence.xml 文件?