Tomcat 6 と tomcat-jdbc.jar および tomcat プーリングを使用しています (現在、最新バージョンの 7.0.28 を使用していますが、以前のバージョンでも試しました)。
これは、バックエンドで PostgreSQL を使用しています。
約 2 ~ 5 日に 1 回 (発生するのは「ランダム」です)、サーバーは利用可能なすべてのデータベース接続を約 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) ログに記録すると、接続が開いたときは表示されますが、閉じたときは表示されません。どうすればオンにできますか?