1

每次 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 处理的条件(例如:不符合自动代理的条件)

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

4

4 回答 4

1

有趣的问题

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

如果您使用外部连接池提供程序,最好始终指定destroy-method,以便在spring应用程序关闭时立即关闭数据源

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

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

采取两种方法删除maxConnectionAge&maxIdleTime

通过更改以下两个参数进行测试,它们在性能损失方面是昂贵的

testConnectionOnCheckout =true 
preferredTestQuery =SELECT 1

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

将上述设置更改为以下设置,因为以下设置在性能方面的成本较低

idleConnectionTestPeriod – 30 
preferredTestQuery =SELECT 1

发表你的发现

于 2013-02-10T04:06:36.423 回答
0

我会检查

于 2013-02-05T22:17:55.937 回答
0

您需要定期进行连接测试,以便防火墙等网络设备不会终止连接。此处的所有详细信息:C3P0 配置

于 2013-02-01T19:26:46.033 回答
0

我建议,首先按照“user395072”的建议在您的应用程序 bean 配置中添加一个销毁方法

除此之外,请检查 mySQL 连接和服务器配置属性。我相信,mySQL 有大约 1000 个查询的默认限制(我在 mySQL 5.24 上看到了这个)。据我推测,断开连接发生在 mySQL 层——服务器可能“认为”不再需要连接。如果有固定的“断开连接”时间框架或与断开连接相关的任何用户事件,则可能会出现应用程序配置问题。

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

于 2013-02-10T21:21:18.450 回答