2011-07-11 10 views
4

私はTomcat上でHibernateとC3P0を使ってJava Webアプリケーションを実行しています。すべてのエンティティクラスとJPAコントローラはNetbeans wizzardで実行されました。サーブレットが呼び出されると、(JPAコントローラを使用して)データベースに多数のオブジェクトが挿入されます。C3P0たくさんのスレッドとタイマーを作成する

問題は、私のwebappをJava VisualVMで見ると、多くのTimersクラスとcom.mchange.v2.async.ThreadPoolAsynchronousRunnerクラスがあり、時間が経つにつれて大きくなることがわかりました。タイマーごとに3つのスレッドが作成されます。

すべてのスレッドとタイマーはWAIT状態にあります。この問題は、アプリケーションのOutOfMemoryエラー(Javaヒープスペース)の後ろにある可能性があります。生成する。サーブレットがタスクを終了したときにすべての接続が閉じられていることがMySQL管理者に分かっていても、一部のオブジェクトがまだメモリに残っている可能性があります。

C3P0が「WAIT」状態で700個以上のTimerasと2100 Threadsを作成するのは正常ですか?あなたが任意のコードを投稿していなかったとして

おかげ

エセキエル

答えて

-2

は、私は推測することができますが、それはあなたがプールの多くを作成しているほとんどのように聞こえます。 接続が必要になるたびにプールを1つ作成するのではなく、実際には1つのプールを再利用するようにしてください。

一度同じことが起こった(誤って)。私はOutOfMemoryに遭遇していませんでしたが、データベースサーバーのmax-connection-limitに達しました。

+0

ボリスさんに感謝します。C3P0のない同じコードは、C3P0の同じコードよりもメモリ消費量がはるかに少ないことが分かりました。 C3P0に接続プールの再利用を明示するにはどうすればよいですか?または、少なくとも新しいプールを作成していることがわかります。ありがとう。 – Ezequiel

+0

C3P0に再利用を指示することはできません。あなたはそれを自分で再利用する必要があります。あなたのやり方はあなた次第です(静的変数、jndi、注射、...) – Boris

+0

私は同じ問題を抱えていますが、答えが役に立たない – ayengin

関連する問題