【问题标题】:C3P0 Spring Hibernate: Pool maxed out. How to debug?C3P0 春季休眠:池已满。如何调试?
【发布时间】:2017-06-06 00:49:15
【问题描述】:

我在 Tomcat 上有一个 Spring Hibernate 应用程序。 连接池为 C3P0

我很快就遇到了来自 C3P0 的线程池最大化警告。然后对 webapp 的所有请求都会挂起。

我仍然假设在代码中的某个地方我错过了@Transaction 注释。我想调试我的代码。

问题:我可以通过代码访问连接池,以便在连接释放和未释放连接时进行调试吗?

更新:当前 c3p0 配置:

<!-- Hibernate -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="org.postgresql.Driver" />
		<property name="jdbcUrl" value="jdbc:postgresql://localhost/ikoda01?useUnicode=true&#38;characterEncoding=utf8" />
		<property name="user" value="xxxuser" />
		<property name="password" value="xxxxx" />

		<property name="acquireIncrement" value="2" />
		<property name="minPoolSize" value="3" />
		<property name="maxPoolSize" value="50" />
		<property name="maxIdleTime" value="600" />
	</bean>

【问题讨论】:

  • 如果你的连接池在增长但从未缩小,这意味着你的事务是打开的但从未关闭过。确保您没有自己实例化事务 bean。

标签: spring hibernate c3p0


【解决方案1】:

我可以通过代码访问连接池,以便在连接释放和未释放连接时进行调试吗?

Yes

您甚至不必编写代码,这是内置的。如果您将 c3p0 配置为调试连接泄漏,它只会将检查泄漏连接的代码路径的堆栈跟踪打印到您的日志中。

更新:

<property name="unreturnedConnectionTimeout" value="30" />
<property name="debugUnreturnedConnectionStackTraces" value="true" />

unreturnedConnectionTimeout 应使用的值取决于您的应用程序。它应该比连接的最长预期合法使用时间更长,但不是越短,您就会越快获得有关泄漏的日志消息,并且您的应用程序将更顺利地解决它。对于大多数 web 应用程序,上面显示的 30 秒是保守的,客户端预计不会等待大约 30 秒的响应,因此超时安全地表明连接泄漏。

【讨论】:

  • 干杯,记录一下,你有指定这个的配置行吗?
  • 当然。您可以更新以显示您当前 c3p0 配置的几行,以便我可以正确获取格式吗? (即,您是否需要休眠配置文件、c3p0.properties 文件等格式……)
  • @Jake 我的更新见上文。希望没关系,我现在正在打电话,所以如果我对格式做了任何奇怪的事情。但希望很清楚您将如何配置连接泄漏调试。
  • 完美!太感谢了。应该对其他人也很有价值
猜你喜欢
  • 1970-01-01
  • 2020-08-13
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2012-12-05
  • 2015-06-30
相关资源
最近更新 更多