-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 のすべてのプロセスは、「トランザクションでアイドル状態」の状態にあります。

ありがとうございました!

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 に答える