-1

我正在使用 Spring 3.0.5.RELEASE 和 Postgres 9.1。我将最大连接数限制为 17:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="${database.driver}" />
  <property name="jdbcUrl" value="${database.url}" />
  <property name="user" value="${database.username}" />
  <property name="password" value="${database.password}" />
  <property name="initialPoolSize" value="3" />
  <property name="minPoolSize" value="1" />
  <property name="maxPoolSize" value="17" />
</bean>

当我的应用程序占用所有连接时,它只是挂起,不会取消或接受更多事务。Postgres 中的所有进程都处于“idle in transaction”状态。

谢谢!

4

2 回答 2

2

“事务中的空闲”意味着您启动了事务但从未提交或回滚它。确保在使用完所有语句后关闭它们。如果您打开的语句不明显,请修改您的 postgresql.conf 文件以使用以下设置记录查询的进程 ID:

log_line_prefix = '%p'
log_statement = 'all'

当您重新加载 PostgreSQL 并检查日志文件时,您将能够看到挂在“事务中空闲”状态的连接发出的所有查询。

于 2012-08-02T20:25:19.103 回答
1

您描述的症状与您的应用程序的泄漏连接一致。也就是说,您的应用程序正在签出连接,但未能将它们重新签入 [即,未能调用 close()]。

您是否一直在使用强大的资源清理习语?参见例如

http://old.nabble.com/Re:-My-connections-are-all-idle...-p27691635.html

正如该链接中所建议的,尝试临时设置一个 unreturnedConnectionTimeout 并使用
debugUnreturnedConnectionStackTraces 来追踪泄漏。看

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

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

我希望这有帮助!

于 2012-08-02T22:21:22.930 回答