39

c3p0構成が直面している問題に苦労しています。先週質問を投稿しました

4

2 に答える 2

50

これは、リソースを最小限に抑えるために使用している構成です。もちろん、必要なリソースを使用するようにアプリケーションを調整する必要があります...

参考http ://www.mchange.com/projects/c3p0/index.html

  • testConnectionOnCheckinプールに返されるときに接続を検証します。testConnectionOnCheckOut、使用前にアクティブな接続を確保しますが、コストがかかりすぎます。
  • idleConnectionTestPeriod接続をテストする前にアイドル状態を維持する時間の制限を設定します。preferredTestQuery を使用しない場合、デフォルトはDatabaseMetaData.getTables()- です。これはデータベースに依存せず、比較的高価な呼び出しですが、比較的小規模なデータベースではおそらく問題ありません。パフォーマンスに偏執的である場合は、データベースに固有のクエリを使用します (つまりpreferredTestQuery="SELECT 1")
  • maxIdleTimeExcessConnectionsminPoolSizeアクティビティが急増した後に connectionCount を元に戻します。

以下の構成では、プールサイズを 3 ~ 20 に設定します。アイドル状態の接続は、アクティブな状態を維持するために 5 分ごとに再テストされます。のためidleConnectionTestPeriod、これは最小数の接続のみを維持します。4 分の時点で 3 つ以上の接続がある場合は、それらの接続を強制終了し、リソースを解放して最小限に戻します。

の使用maxIdleTimeExcessConnectionsidleConnectionTestPeriodその必要性を否定する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>
于 2012-09-21T13:21:37.350 に答える
2

最適な構成は、コンテナー環境を使用して DataSource を取得するように JPA をセットアップすることです。

これにより、コンテナーは、JPA プロジェクトに直接構成するのではなく、接続プールを提供できます。

作業しているコンテナ環境を指定しません。私はほとんどの場合、Java SE デスクトップやサーバー アプリケーションなどのスタンドアロン アプリケーションで c3p0 を使用しています。Springフレームワークでも使用しています。

サーブレット (Tomcat/Jetty) やアプリケーション サーバー (Glashfish や JBoss AS など) などのコンテナーを使用する場合、これらは、通常は c3p0 ではなく同等の機能を提供する DataSource 接続プーラーの実装を既に提供しています。

JPA プロジェクト内で接続プーラーを構成しようとしたことはありません。これは、構成を編集して実行する必要があるすべての環境に合わせてカスタマイズすることを意味するためです。

于 2012-09-20T07:04:20.203 に答える