我们正在使用带有 tomcat-jdbc.jar 和 tomcat 池的 Tomcat 6(我们目前使用的是最新版本 7.0.28,但也尝试过使用以前的版本)。
这是在后端使用 PostgreSQL。
大约每 2 到 5 天一次(这是相当“随机”发生的),我们的服务器在大约 10 分钟的时间内耗尽了所有可用的数据库连接,我们在日志中看到了这些(我们已经打开了 FINE 日志记录) ):
2012-10-01 18:40:29,998 ERROR [TP-Processor29] JDBCExceptionReporter.logExceptions(72) | [TP-Processor29] Timeout: Pool empty. Unable to fetch a connection in 0 seconds, none available[size:150; busy:41; idle:0; lastwait:0].
2012-10-01 18:40:30,000 ERROR [TP-Processor29] JDBCExceptionReporter.logExceptions(72) | [TP-Processor29] Timeout: Pool empty. Unable to fetch a connection in 0 seconds, none available[size:150; busy:41; idle:0; lastwait:0].
我正在尝试追查此问题的根本原因。
当查看数据库并发生这种情况时,所有连接都显示为“IDLE”。
我们当前的配置如下所示:
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://db/dbname?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="postgres"/>
<property name="password" value="postgres"/>
<property name="initialSize" value="8"/>
<property name="maxActive" value="150"/>
<property name="maxIdle" value="10"/>
<property name="maxWait" value="30"/>
<property name="defaultAutoCommit" value="true"/>
<property name="validationQuery" value="SELECT 1"/>
<property name="validationInterval" value="60000"/>
</bean>
而且,我们在 logging.properties 中的登录是:
org.apache.tomcat.jdbc.pool.level=FINE
大多数时候,我们使用大约 15 到 20 个数据库连接,但是,正如我所提到的,问题是每隔几天,它就会迅速用完所有连接,并且需要重新启动。
我们试图将其归结为 Tomcat 池问题、Hibernate 问题、Spring 问题或应用程序问题。
首先,任何想法为什么:
A) 为什么显示:[size:150; 忙:41;空闲:0;lastwait:0] ...其他 150-41 个连接在哪里?
B)记录时,它显示连接何时打开,但不显示连接何时关闭。我们怎样才能打开它?