hibernate - 从服务器成功接收到的最后一个数据包是在 109,253 毫秒前

标签 hibernate jpa c3p0

我知道这个问题已被多次询问和回答,但没有解决方案适用于此。

在生产环境中,我收到类似这样的错误“从服务器成功接收到的最后一个数据包是在 109,253 毫秒前。”。所以我选择了 c3p0 并在 persistence.xml 中进行了以下配置,为了测试,将 my.cnf 中的 mysql 属性设置为 wait_timeout=60 并在设置下使用。

<properties>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
            <property name="hibernate.show_sql" value="true"></property>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost/Test"/>
            <property name="hibernate.connection.user" value="****" />
            <property name="hibernate.connection.password" value="***" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.hibernate.auto_close_session" value="true" />

            <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/> 
            <property name="hibernate.c3p0.acquire_increment" value="1"/>
            <property name="hibernate.c3p0.idle_test_period" value="10"/>
            <property name="hibernate.c3p0.min_size" value ="5"/>
            <property name="hibernate.c3p0.max_size" value="20"/>
            <property name="hibernate.c3p0.timeout" value="50"/>
            <property name="hibernate.c3p0.preferredTestQuery" value="select 1"/>
            <property name="hibernate.c3p0.testConnectionOnCheckout" value="true"/>             
    </properties>

即使在我看到的日志中

Nov 20, 2014 1:06:35 PM com.mchange.v2.c3p0.C3P0Registry banner
INFO: Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10]
Nov 20, 2014 1:06:35 PM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@1e8ef9ca [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@1f5f812 [ acquireIncrement -> 1, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> z8kfsx951kn0e3017dmiyd|24ba9ccb, idleConnectionTestPeriod -> 10, initialPoolSize -> 5, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 50, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 75, maxStatementsPerConnection -> 0, minPoolSize -> 5, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@fa4d1db0 [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> z8kfsx951kn0e3017dmiyd|29c3481b, jdbcUrl -> jdbc:mysql://localhost/DAL, properties -> {user=******, password=******} ], preferredTestQuery -> select 1, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> true, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> z8kfsx951kn0e3017dmiyd|126d8fa6, numHelperThreads -> 3 ]

但仍然遇到同样的问题。我尝试了很多东西,甚至在类路径中制作了 hibrenate.properties,因为我读到一些东西,其中有一些属性,如 preferredTestQuery 需要在属性文件中设置,所以我在类路径中创建了一个具有以下属性的属性文件

hibernate.c3p0.idle_test_period=10
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=75
hibernate.c3p0.max_statements=75
hibernate.c3p0.timeout=50
hibernate.c3p0.preferredTestQuery=select 1
hibernate.c3p0.testConnectionOnCheckout=true

我看到的连属性都在加载日志中

org.hibernate.cfg.Environment - HHH000205: Loaded properties from resource hibernate.properties: {hibernate.c3p0.testConnectionOnCheckout=true, hibernate.c3p0.timeout=50, hibernate.c3p0.min_size=5, hibernate.c3p0.max_size=75, hibernate.bytecode.use_reflection_optimizer=false, hibernate.c3p0.preferredTestQuery=select 1, hibernate.c3p0.max_statements=75, hibernate.c3p0.idle_test_period=10

但如果我在一分钟后尝试,仍然会出现相同的错误。我不明白我错过了什么。请告诉我?

最佳答案

您的应用程序可能会保持连接打开,而不是立即将它们返回到池中。

要对此进行测试,请尝试设置 unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTraces。参见 here了解详情。

然后检查您的日志。如果您的连接超时未返回,请查看打开连接的代码路径的记录堆栈跟踪,并修改您的应用程序代码以迅速可靠地关闭()这些连接,并根据需要从数据源获取连接-及时。

关于hibernate - 从服务器成功接收到的最后一个数据包是在 109,253 毫秒前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27034396/

相关文章:

java - 日期类和 Hibernate

hibernate - 在 Grails (GORM) 中处理并发修改,同时避免陈旧对象异常

mysql - 玩! Framework 1.2.4 --- C3P0 设置以避免通信链路故障导致空闲时间

java - 实体列表上的 Hibernate 过滤器,但只检索其中一个属性

java - maven/eclipse JPA 项目和实体生成?

java - 尽管 autoApply=false 并且属性未使用 @Convert 注释,但仍应用 JPA 属性转换器

jpa - OpenJPA 上的列顺序

java - c3p0 Java 数据库池,故障转移配置

web-services - c3p0 回滚事务而不是提交

Plat Framework 1.2.7 升级到 1.5.2 后出现 MySQLIntegrityConstraintViolationException