【问题标题】:Hibernate JDBCConnectionException - C3p0 connection poolingHibernate JDBCConnectionException - C3p0 连接池
【发布时间】:2012-12-13 13:17:11
【问题描述】:

我们正在使用 HibernateORM 为我们的 mysql 数据库使用 C3p0 连接池。

下面是hibernate.cfg.xml中的设置

<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.maxConnectionAge">3600</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.max_size">300</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property>

为了在 28800 秒后重新连接到数据库,我们设置了参数 -

c3p0.testConnectionOnCheckout=true

但我们正面临休眠异常。

因此,如果我现在调用 DB 并等待 8 小时(或者我设置 my.cnf 的变量 wait_timeout 的任何时间),如果我再次调用 DB ,我会得到该异常。 堆栈跟踪 -

org.hibernate.exception.JDBCConnectionException: could not execute query
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        at org.hibernate.loader.Loader.doList(Loader.java:2536)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
        at org.hibernate.loader.Loader.list(Loader.java:2271)
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
        at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
        at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
        at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)

为了快速解决这个问题,我们每天早上都会重启应用服务器。

任何帮助将不胜感激

-- 谢谢

【问题讨论】:

标签: hibernate c3p0


【解决方案1】:

如果您的配置是您认为的那样,那么这些异常绝不可能来自陈旧的连接在闲置并在池中超时后被检出。无论如何,连接都会在一个小时后过期,它们的空闲时间不会超过大约五分钟,它们会在结帐时进行测试。

正在发生两件事之一:

1) 你没有你认为你有的配置,在你的配置和它想要配置的 c3p0 数据源之间的中间出现了问题。

幸运的是,c3p0 数据源在初始化时会将其配置转储到 INFO 级别。检查您的日志,并验证您的池是否具有您想要的配置。

2) 也许您的应用程序在池外保持连接,而不是在短时间内检查它们并关闭()它们,因此如果您的应用程序保持连接,c3p0 可以进行所有测试、过期等时间长到他们超时,c3p0 对此无能为力。但是,c3p0 可以帮助您测试这是否是正在发生的事情。尝试配置参数 unreturnedConnectionTimeout 和 debugUnreturnedConnectionStackTraces。一起使用它们。见

http://www.mchange.com/projects/c3p0/#configuring_to_debug_and_workaround_broken_clients

http://www.mchange.com/projects/c3p0/index.html#unreturnedConnectionTimeout

http://www.mchange.com/projects/c3p0/index.html#debugUnreturnedConnectionStackTraces

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-09
    • 2012-07-06
    • 2017-10-16
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2011-04-20
    • 2013-08-20
    相关资源
    最近更新 更多