使用 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 配置参数 unreturnedConnectionTimeout
和 debugUnreturnedConnectionStackTraces
来调试连接泄漏。
见here。
(注意:在 hibernate.cfg 中它们会是 hibernate.c3p0.unreturnedConnectionTimeout
和 hibernate.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?