を尊重していない、と我々はのためにHibernateとC3P0を使用しています接続プールを管理する年。システムの成長に合わせ休止/ C3P0接続プールの最大サイズは、我々は多くのデバイス(appserversと、マルチビューワなど)がイベントをログに記録する1つのアプリケーションサーバー上にあるPostgresデータベースに接続するシステムを持っている
しかし、1秒あたりのイベント数百人は、時々、単一のデバイスでログインすることができ、我々はしばらく後に、我々はいくつかのデバイスが接続の彼らの最大数を超えて見ることに気付きました。たとえば、hibernate.c3p0.max_size=40
を持つことができますが、依然として百もの接続が表示されます。 min_size
とtimeout
などの
その他の設定は、同じファイルで同じように設定されていると我々は彼らが必要のようにそれらを有効に見るので、私はこの問題は、構成が定義されている方法ではなく、かなり確信しています。
私は研究をして、今2週間、この問題を解決しようとしてきました。いくつかの点では、すべてのスレッドが独自のHibernateセッションを取得する方法に何か問題があったと思われますが、多分同じプールを再利用するのではなく、新しいスレッドプールが開かれるようになるかもしれませんが、C3P0のソースコードとプールは実際にはセッションではなくユーザー名/パスワードで管理されているようですが、セッションごとに同じユーザー名とパスワードを使用するので、今は非常に困惑してアイデアが不足しています。私はコピー&ペーストするためにここにすべての関連部分を
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.connection.username=***
hibernate.connection.password=***
hibernate.connection.url=jdbc:postgresql://localhost/eventlog
hibernate.c3p0.min_size=10
hibernate.c3p0.max_size=40
hibernate.c3p0.acquire_increment=10
hibernate.c3p0.max_statements=200
hibernate.c3p0.timeout=3600
hibernate.c3p0.idle_test_period=1800
私たちのコードは(古いものと醜い、と率直に言って)あまりにも巨大である:ここでは
は、それがどんな助けになることができた場合の構成の一部です私は議論を進めるために必要に応じてスニペットを提供するために最善を尽くします。今のところ私は出発する場所を探しています。ありがとう! SteveWaldmanさんのコメント@
この状況は非常に複雑で、質問に明確かつ簡潔に説明することは困難です。私の記述が不明確であるか、重要な詳細が欠落している場合は、お詫び申し上げます。あなたが私に何か情報を加えなければならないと思ったら、私に知らせてください。私はそれを提供するために全力を尽くします。 – mllec
c3p0 'close()'内部スレッドプールを介して非同期に接続します。デフォルトでは、プールは小さく、おそらくアプリケーションにとっては小さすぎます。スレッドプールがバックログになった場合、c3p0の観点からは論理的に閉じているが、物理的にはまだ開いている非同期クローズが実際に発生するのを待っている可能性があります。 'hibernate.c3p0.numHelperThreads = 15'のようなものを追加し、それが役立つかどうか確認してください。 –
@SteveWaldman今の設定は5に設定されています。ありがとう! - アプリケーションの漏れがある場合は、これらの特性は彼らが暗闇で光るようになりますhttp://www.mchange.com/projects/c3p0/#configuring_to_debug_and_workaround_broken_clients:デバッグ未返還接続タイムアウトプロパティで – mllec