在一些空闲时间后丢失JPA连接

时间:2013-02-01 17:30:40

标签: java hibernate jpa

每次API闲置一段时间后,我确实失去了与数据库的连接(时间无法精确定义。可能在几秒钟的空闲时间之后发生,有时在分钟之后空闲时间,有时甚至在码头之后重新开始)。这个问题在不同的机器上是可重现的,所以我直接调查它与mysql数据库没有任何关系。

抛出的异常可以是found here

数据库配置基于hibernate和spring:

 <!-- c3p0 of version 0.9.2.1 (current stable) -->
 <!-- spring data: 1.2.0.RELEASE -->
 <!-- mysql connector: 5.1.18 -->
 <!-- hibernate: 4.1.9.FINAL --> 
 <bean id="basisDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClassName}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="20" />
    <property name="maxIdleTime" value="600" />
    <property name="maxConnectionAge" value="86400" />
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="de.yourdelivery.data.*" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="true" />
            <property name="database" value="MYSQL" />
        </bean>
    </property
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

数据库连接和驱动程序紧随其后:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://xxx:3306/xxx?zeroDateTimeBehavior=convertToNull

它甚至不能用于扩展jdbc.url

&autoReconnect=true&autoReconnectForPools=true

我使用OpenSessionInView Pattern在dozer映射期间延迟加载我所需的所有关系(我知道它被认为是一种反模式,但它到目前为止工作正常,所以目前没有将其归咎于该模式)

Mysql wait_timeout设置为28800

C3PO的启动日志就像那样

  

13:34:54,687 INFO PropertySourcesPlaceholderConfigurer:177 - 正在加载   来自文件的属性文件   [/opt/jetty/jetty-distribution-8.1.8.v20121106/webapps/rest/WEB-INF/classes/properties/customer.fidelity.points.properties]   13:34:54,687 INFO PropertySourcesPlaceholderConfigurer:177 - 正在加载   来自文件的属性文件   [/opt/jetty/jetty-distribution-8.1.8.v20121106/webapps/rest/WEB-INF/classes/properties/application.properties]   13:34:54,687 INFO PropertySourcesPlaceholderConfigurer:177 - 正在加载   来自文件的属性文件   [/opt/jetty/jetty-distribution-8.1.8.v20121106/webapps/rest/WEB-INF/classes/properties/restapi.properties]   13:34:54,688 INFO PropertySourcesPlaceholderConfigurer:177 - 正在加载   来自文件的属性文件   [/opt/jetty/jetty-distribution-8.1.8.v20121106/webapps/rest/WEB-INF/classes/properties/database.properties]   13:34:54,623 INFO MLog:80 - 使用log4j日志记录的MLog客户端。   13:34:54,683 INFO C3P0Registry:204 - 初始化c3p0-0.9.1.2 [内置   2007年5月21日15:04:56;调试?真正;追踪:10] 13:34:55,111 INFO   XmlWebApplicationContext:1350 - Bean&#39; deDataSource&#39;类型[类   com.mchange.v2.c3p0.ComboPooledDataSource]不符合获取条件   由所有BeanPostProcessors处理(例如:不符合条件)   自动代理)13:34:55,148 INFO XmlWebApplicationContext:1350 - Bean   &#39; plDataSource&#39;类型[类   com.mchange.v2.c3p0.ComboPooledDataSource]不符合获取条件   由所有BeanPostProcessors处理(例如:不符合条件)   自动代理)13:34:55,150 INFO XmlWebApplicationContext:1350 - Bean   &#39;数据源&#39;类型[类   de.yourdelivery.data.routing.DomainRouting]不符合条件   由所有BeanPostProcessors处理(例如:不符合条件   for auto-proxying)13:34:55,167 INFO XmlWebApplicationContext:1350 -   豆   &#39;#org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter 24bb6086&#39;   类型[类   org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]不是   有资格获得所有BeanPostProcessors处理(例如:   不符合自动代理条件)13:34:55,213 INFO   LocalContainerEntityManagerFactoryBean:264 - 构建JPA容器   EntityManagerFactory用于持久性单元&#39;默认&#39; 13:34:55,332 INFO   版本:37 - HCANN000001:Hibernate Commons Annotations {4.0.1.Final}   13:34:55,338 INFO版本:41 - HHH000412:Hibernate Core   {4.1.9.Final} 13:34:55,341 INFO环境:239 - HHH000206:   找不到hibernate.properties 13:34:55,342 INFO环境:342 -   HHH000021:字节码提供者名称:javassist 13:34:55,361 INFO   Ejb3Configuration:527 - HHH000204:处理PersistenceUnitInfo [           名称:默认           ...] 13:34:55,795 INFO ConnectionProviderInitiator:188 - HHH000130:实例化显式连接提供程序:   org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider   13:34:55,880 INFO AbstractPoolBackedDataSource:462 - 正在初始化   c3p0 pool ... com.mchange.v2.c3p0.ComboPooledDataSource [   acquireIncrement - &gt; 3,acquireRetryAttempts - &gt; 30,acquireRetryDelay    - &GT; 1000,autoCommitOnClose - &gt; false,automaticTestTable - &gt; null,breakAfterAcquireFailure - &gt; false,checkoutTimeout - &gt; 0,   connectionCustomizerClassName - &gt; null,connectionTesterClassName - &gt;   com.mchange.v2.c3p0.impl.DefaultConnectionTester,dataSourceName - &gt;   1hge17b8s1e4h6uz10tbcor | 3efe0ce9,debugUnreturnedConnectionStackTraces    - &GT; false,description - &gt; null,driverClass - &gt; com.mysql.jdbc.Driver,factoryClassLocation - &gt; null,forceIgnoreUnresolvedTransactions - &gt;   false,identityToken - &gt; 1hge17b8s1e4h6uz10tbcor | 3efe0ce9,   idleConnectionTestPeriod - &gt; 0,initialPoolSize - &gt; 3,jdbcUrl - &gt;   jdbc:mysql://192.168.1.10:3306 / xxxx?zeroDateTimeBehavior = convertToNull,maxAdministrativeTaskTime - &gt; 0,maxConnectionAge - &gt; 86400,maxIdleTime    - &GT; 600,maxIdleTimeExcessConnections - &gt; 0,maxPoolSize - &gt; 20,maxStatements - &gt; 0,maxStatementsPerConnection - &gt; 0,minPoolSize - &gt; 5,   numHelperThreads - &gt; 3,numThreadsAwaitingCheckoutDefaultUser - &gt; 0,   preferredTestQuery - &gt; null,properties - &gt; {用户= * ,   密码= * },propertyCycle - &gt; 0,testConnectionOnCheckin - &gt;   false,testConnectionOnCheckout - &gt; false,unreturnedConnectionTimeout    - &GT; 0,usesTraditionalReflectiveProxies - &gt; false] 13:34:56,086 INFO方言:123 - HHH000400:使用方言:   org.hibernate.dialect.MySQLDialect 13:34:56,095 INFO   LobCreatorBuilder:120 - HHH000424:禁用上下文LOB创建   因为createClob()方法抛出错误:   java.lang.reflect.InvocationTargetException 13:34:56,108 INFO   TransactionFactoryInitiator:73 - HHH000268:交易策略:   org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory   13:34:56,112 INFO ASTQueryTranslatorFactory:48 - HHH000397:使用   ASTQueryTranslatorFactory 13:34:56,149 INFO版本:24 - Hibernate   Validator 4.2.0.Final 13:34:56,916 INFO XmlWebApplicationContext:1350    - Bean&#39; entityManagerFactory&#39;类[class org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]的类型是   没有资格获得所有BeanPostProcessors处理(for   示例:不符合自动代理的条件)

那么为什么应用程序在空闲时间失去连接?

4 个答案:

答案 0 :(得分:1)

有趣的问题

可能由于多种原因而发生。您的应用服务器正在失去与数据库的连接。很难说看日志只有空闲的连接是唯一被杀死的连接。 您的数据库服务器可能没有分配连接。我希望您检查了数据库日志中的错误。您如何处理服务中的交易?你在使用春季交易吗?

如果您正在使用外部连接池提供程序,那么总是指定destroy-method是个好主意,以便在spring应用程序关闭时立即关闭数据源

<bean id="basisDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

在c3p0池设置中更改以下内容

采取两种方法 删除maxConnectionAge&amp; maxIdleTime

通过更改以下两个参数进行测试,它们在性能命中方面很昂贵

testConnectionOnCheckout =true 
preferredTestQuery =SELECT 1

如果您能够使用上述设置解决它

将以上设置更改为以下设置,因为在性能命中方面,以下成本更低

idleConnectionTestPeriod – 30 
preferredTestQuery =SELECT 1

发布您的发现

答案 1 :(得分:0)

您需要定期进行连接测试,以便防火墙等网络设备不会终止连接。所有细节都在这里:C3P0 configuration

答案 2 :(得分:0)

我会检查

答案 3 :(得分:0)

我建议,首先在应用程序bean配置中添加一个destroy方法,如'user395072'

所示

除此之外,请检查mySQL连接和服务器配置属性。我相信,mySQL有1000个查询默认限制(我在mySQL 5.24上看到了这个)。据我所知,断开是在mySQL层发生的 - 服务器可能在'思考'不再需要连接。如果存在固定的“断开连接”时间范围或与断开连接相关的任何用户事件,则可能存在应用程序配置问题。

在您的情况下,我强烈认为,这是数据库服务器配置。