私は Heroku で Web サービスを実行しており、そのパフォーマンスを監視するために New Relic を使用しています。MySQL を Hibernate 上で使用しています。デフォルト以外の c3p0 設定は次のとおりです。
hibernate.c3p0.maxStatementsPerConnection, 5
hibernate.c3p0.maxPoolSize, 35
hibernate.c3p0.minPoolSize, 5
hibernate.c3p0.initialPoolSize, 10
hibernate.c3p0.acquireIncrement, 10
私の Web サービスへのすべてのリクエストは、データベースに少なくとも数回ヒットします。約 200 リクエスト/分の負荷テストを 10 分間実行した後、ほとんどの時間が費やされていることがわかりました。
com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection
接続プールで接続を待っていると思いますか? 面白い部分は私が増加したようです
hibernate.c3p0.maxPoolSize, 40
パフォーマンスは悪化しました (同じ呼び出しでの待ち時間が長くなりましたgetConnection
。テスト中に、MySQL サーバーで最大接続数が実際に開いていることがわかりc3p0
ます (MySQL 側で設定された最大接続数は であり300
、使い果たされていません)。
データベース関数はすべて同じ形式を使用しています
public void executeTransaction( Session session, IGenericQuery<T> query, T entity )
{
Transaction tx = null;
try
{
tx = session.beginTransaction();
query.execute( session, entity );
tx.commit();
}
catch ( RuntimeException e )
{
try
{
tx.rollback();
}
catch ( RuntimeException e2 )
{
}
throw e;
}
finally
{
if ( session != null )
{
session.close();
}
}
}
したがって、すべてのセッションが閉じられていると確信しています。これは、接続の閉じにつながるはずです。接続の最大数を増やすと、待機時間が長くなるのはなぜですか? hibernate.c3p0.maxPoolSize, 25
からまではパフォーマンスが向上しているように見えますが、をhibernate.c3p0.maxPoolSize, 30
超えると低下しhibernate.c3p0.maxPoolSize, 35
ます。私の価値観はかけ離れていますか?
ありがとう!