私はc3p0構成に直面している問題に苦労しています。 先週質問を投稿しました
これは、リソースを最小限に抑えるために使用している構成です。もちろん、必要なリソースを使用するようにアプリケーションを調整する必要があります...
参照: http://www.mchange.com/projects/c3p0/index.html
testConnectionOnCheckin
は、プールに返されるときに接続を検証します。 testConnectionOnCheckOut
は、使用前にアクティブな接続を保証しますが、実行するにはコストがかかりすぎます。idleConnectionTestPeriod
は、接続をテストする前にアイドル状態を維持する時間の制限を設定します。 preferredTestQueryがない場合、デフォルトはDatabaseMetaData.getTables()
です。これはデータベースに依存せず、比較的高価な呼び出しですが、比較的小さなデータベースにはおそらく問題ありません。パフォーマンスに不安がある場合は、データベース固有のクエリを使用します(つまり、preferredTestQuery="SELECT 1"
)maxIdleTimeExcessConnections
は、アクティビティの急増後にconnectionCountをminPoolSize
に戻します。以下の構成では、poolsizeを3〜20に設定します。アイドル状態の接続は5分ごとに再テストされ、アクティブな状態が維持されます。 idleConnectionTestPeriod
のため、これは接続の最小数を維持するだけです。 4分の時点で3つを超える接続がある場合、それらの接続を強制終了してリソースを最小に戻します。
maxIdleTimeExcessConnections
とidleConnectionTestPeriod
を使用すると、maxIdleTime
の必要がなくなります
<Context docBase="myapp" path="/myapp" reloadable="true">
<Resource description="My DB Datasource" name="jdbc/mydb"
auth="Container" factory="org.Apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
user="myuser" password="******"
minPoolSize="3"
maxPoolSize="20"
acquireIncrement="1"
driverClass="com.mysql.jdbc.Driver"
jdbcUrl="jdbc:mysql://localhost:3306/mydb"
testConnectionOnCheckin="true"
idleConnectionTestPeriod="300"
maxIdleTimeExcessConnections="240"
/>
</Context>
最適な構成は、コンテナ環境を使用してDataSourceを取得するようにJPAをセットアップすることです。
これにより、コンテナはJPAプロジェクトに直接設定するのではなく、接続プーリングを提供できます。
作業しているコンテナ環境を指定しません。私はほとんどの場合、Java SEデスクトップまたはサーバーアプリケーションなどのスタンドアロンアプリケーションでc3p0を使用します。Springフレームワークでも使用します。
Servlet(Tomcat/Jetty)やApplication Server(GlashfishやJBoss ASなど)などのコンテナーを使用する場合、これらは既にc3p0ではないが同等の機能を提供するDataSource接続プーラー実装を既に提供しています。
JPAプロジェクト内で接続プーラーを構成しようとしたことはありません。これは、構成を編集して実行する必要があるすべての環境に合わせてカスタマイズすることを意味するためです。これは頭痛の種です。