每次 API 空闲一段时间时,我都会失去与数据库的连接(时间无法精确定义。它可能在几秒钟的空闲时间后发生,有时在几分钟后空闲时间,有时甚至在码头重新启动后)。这个问题在不同的机器上是可以重现的,所以我认为它与 mysql 数据库直接无关。
抛出的异常可以在这里找到
数据库配置基于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 模式在推土机映射期间延迟加载所有我需要的关系(我知道它被认为是一种反模式,但到目前为止它工作得很好,所以目前没有将其归咎于该模式)
mysqlwait_timeout
设置为28800
C3PO 的启动日志看起来像这样
属性] 13:34:54,823 INFO MLog:80 - 使用 log4j 日志记录的 MLog 客户端。13:34:54,883 信息 C3P0Registry:204 - 初始化 c3p0-0.9.1.2 [建于 2007 年 5 月 21 日 15:04:56;调试?真的; 跟踪:10] 13:34:55,111 INFO XmlWebApplicationContext:1350 - [class com.mchange.v2.c3p0.ComboPooledDataSource] 类型的 Bean 'deDataSource' 不符合所有 BeanPostProcessors 处理的条件(例如:不符合自动代理)13:34:55,148 INFO XmlWebApplicationContext:1350 - [class com.mchange.v2.c3p0.ComboPooledDataSource] 类型的 Bean 'plDataSource' 不符合所有 BeanPostProcessors 处理的条件(例如:不符合自动代理条件) 13:34:55,150 INFO XmlWebApplicationContext:1350 - Bean 'dataSource' 类型 [class de.yourdelivery.data.routing.*, 密码=*},propertyCycle -> 0,testConnectionOnCheckin -> false,testConnectionOnCheckout -> false,unreturnedConnectionTimeout -> 0,useTraditionalReflectiveProxies -> false] 13:34:56,086 信息方言: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 '[class org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] 类型的 entityManagerFactory' 不符合被所有 BeanPostProcessors 处理的条件(例如:不符合自动代理的条件)
那么为什么应用程序在空闲时间会失去连接呢?