每次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 示例:不符合自动代理的条件)
那么为什么应用程序在空闲时间失去连接?
答案 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)
我会检查
mysql是否没有关闭它的连接 - my.cnf中wait_timeout的值是多少?
如果hibernate使用自己的内部连接池,你应该设置hibernate.connection.provider_class,你可以发布你的hibernate配置吗?见http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e150
答案 3 :(得分:0)
我建议,首先在应用程序bean配置中添加一个destroy方法,如'user395072'
所示除此之外,请检查mySQL连接和服务器配置属性。我相信,mySQL有1000个查询默认限制(我在mySQL 5.24上看到了这个)。据我所知,断开是在mySQL层发生的 - 服务器可能在'思考'不再需要连接。如果存在固定的“断开连接”时间范围或与断开连接相关的任何用户事件,则可能存在应用程序配置问题。
在您的情况下,我强烈认为,这是数据库服务器配置。