使用 c3p0 时出现 MySQL Hibernate 连接问题

Posted

技术标签:

【中文标题】使用 c3p0 时出现 MySQL Hibernate 连接问题【英文标题】:MySQL Hibernate connection issue while using c3p0 【发布时间】:2015-01-07 23:19:21 【问题描述】:

我有一个使用 struts 1.3、Hibernate3 和 Spring 安全性开发的 Web 应用程序。该应用程序之前在 8 小时后死机,因为 mysql 在该时间之后关闭了连接。然后我从几个帖子中收集信息以使其保持很长时间,现在几乎是 20 - 24 小时。任何机构都可以帮助我使这件事发挥作用。

总结

在闲置 20 小时后,我无法登录。连接被 MySQL 关闭。

谢谢。

hibernate和c3p0的配置请看下面的sn-ps。

休眠 cfg 文件 sn-p

    <property name="hibernate.dialect">se.etm.ewo.hibernate.CustomDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">MY_JDBC_URL?autoReconnect=true</property>
    <property name="hibernate.connection.username">username</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.connection.autoReconnect">true</property>
    <property name="hibernate.connection.autoReconnectForPools">true</property>
    <property name="hibernate.c3p0.idle_test_period">100</property>
    <property name="hibernate.c3p0.preferredTestQuery">select 1</property>
    <property name="hibernate.c3p0.testWhileIdle">true</property>
    <property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
    <property name="hibernate.c3p0.min_size">10</property>
    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">update</property>
    <property name="hibernate.current_session_context_class">thread</property>

春天的配置片段

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />

    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="hibernateProperties">
        <ref bean="hibernateProperties" />
    </property>
</bean>

<bean id="hibernateProperties"
    class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="ignoreResourceNotFound" value="true" />
    <property name="location">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
</bean>

<!-- Data source -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="driverClass">
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="jdbcUrl">
        <value>MY_JDBC_URL?autoReconnect=true</value>
    </property>
    <property name="user">
        <value>username</value>
    </property>
    <property name="password">
        <value>password</value>
    </property>
    <property name="initialPoolSize">
        <value>10</value>
    </property>
    <property name="maxPoolSize">
        <value>30</value>
    </property>
    <property name="minPoolSize">
        <value>10</value>
    </property>
    <property name="maxConnectionAge">
        <value>3600</value>
    </property>
    <property name="maxIdleTime">
        <value>3600</value>
    </property>
    <property name="maxIdleTimeExcessConnections">
        <value>1800</value>
    </property>
    <property name="acquireRetryAttempts">
        <value>3</value>
    </property>
    <property name="acquireRetryDelay">
        <value>3000</value>
    </property>
    <property name="breakAfterAcquireFailure">
        <value>false</value>
    </property>
    <property name="preferredTestQuery">
        <value>SELECT 1</value>
    </property>
    <property name="testConnectionOnCheckout">
        <value>true</value>
    </property>
</bean>
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
</bean>

C3p0 日志

INFO AbstractPoolBackedDataSource:462 - 正在初始化 c3p0 池... com.mchange.v2.c3p0.ComboPooledDataSource [acquireIncrement -> 3,acquireRetryAttempts -> 3,acquireRetryDelay -> 3000,autoCommitOnClose -> false,automaticTestTable -> null,breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1br9tik951qql1qj1z141xq|2a868f36, debugUnreturnedConnectionStackTraces -> true, description -> null, driverClass -> com .mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1br9tik951qql1qj1z141xq|2a868f36, idleConnectionTestPeriod -> 0, initialPoolSize -> 10, jdbcUrl -> jdbc:mysql://url?autoReconnect=true, lastAcquisitionFailureDefaultUser -> null, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 3600, maxIdleTime -> 3600, maxIdleTimeExcessConnections -> 1800, maxPoolSize -> 30, maxStatements -> 0,maxStatementsPerConnection -> 0,minPoolSize -> 10,numHelperThreads -> 3,numThreadsAwaitingCheckoutDefaultUser -> 0,preferredTestQuery -> SELECT 1,属性 -> user=******,password=****** , propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> true, unreturnedConnectionTimeout -> 300, usesTraditionalReflectiveProxies -> false ]

c3p0 日志看起来正是这些行,与问题无关。你能找到什么吗?

【问题讨论】:

【参考方案1】:

testWhileIdle 不是 c3p0 属性。它不会伤害任何东西,但可能会让你误以为你正在做一些你没有做的事情。您正在测试空闲连接,可能过于频繁,因为您也在结帐时测试连接。

您的配置分布在两个地方。我不确定 Spring 和 hibernate 配置将如何交互。 c3p0 数据源在池初始化时将配置转储到 INFO。您可能想验证您是否拥有您期望的配置。

你的问题,听起来很像你有连接泄漏。您必须确保从 DataSource 签出的任何 Connection 在 finally 方法中或通过 Java 7+ 中的 try-with-resources 可靠地关闭()。

使用 c3p0 配置参数 unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTraces 来调试连接泄漏。

见here。

(注意:在 hibernate.cfg 中它们会是 hibernate.c3p0.unreturnedConnectionTimeouthibernate.c3p0.debugUnreturnedConnectionStackTraces。或者您可以更直接地在 Spring xml 中设置它们。)

【讨论】:

您好史蒂夫感谢您的回复。我会检查并回复您。 您好,请您检查一下我找到的日志。我已经更新了问题底部的日志。如果您发现了什么,请回复。身份验证为真,但角色为匿名。 您发布的所有日志都与 c3p0 无关。如果您想要 c3p0 的配置,它会在池初始化时由名为“com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource”的记录器转储到 INFO 中。确保您在 INFO 级别记录所有 com.mchange 及以下内容以供日常使用。 我阅读了 c3p0 文档,根据它会登录到 log4j。这就是我在 log4j 日志中的内容。我们是否需要为 c3p0 配置任何日志记录 它将记录到您正在登录的任何内容...如果那是 log4j,那么它将尊重您的 log4j 配置。

以上是关于使用 c3p0 时出现 MySQL Hibernate 连接问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用简单存储过程时出现 MySQL 错误 #1312?

在mysql查询中使用参数时出现mysql语法错误

将 HSQLDB 传输工具与 MySQL 一起使用时出现问题

使用MySQL练习增删改查时出现连接错误

运行 mysql 时出现错误 2002(也使用 sudo)

使用 mysql 运行 JDBC 程序时出现此错误 [重复]