【问题标题】:Spring + c3p0 + postgresSpring + c3p0 + postgres
【发布时间】:2012-08-02 19:44:21
【问题描述】:

我正在使用 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”状态。

谢谢!

【问题讨论】:

  • 你没有给我们太多的工作。 “Idle in transaction”应该是一个非常的瞬时状态——当一个连接处于该状态任意时间时,它通常代表应用程序代码中的一个非常严重的错误,这是你没有显示的我们。

标签: java spring hibernate postgresql c3p0


【解决方案1】:

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

log_line_prefix = '%p'
log_statement = 'all'

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

【讨论】:

    【解决方案2】:

    您描述的症状与您的应用程序的泄漏连接一致。也就是说,您的应用程序正在检出连接,但未能将它们重新检入 [即,未能调用 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

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 2019-08-15
      • 2012-06-30
      • 2013-03-06
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多