jdbc-pool
先月、MySQL接続処理に使用し始めたアプリがあります。それ以前は、Apacheを使用していましたcommons-dbcp
。より高速で、より適切に保守されていることなどを示した分析を読んだ後、jdbc-poolに切り替えました。しかし、より多くのユーザーにプール枯渇エラーが発生していることに気付き始めました。
コモンズからjdbc-poolへの切り替えに関連しているかどうかはわかりませんが、その時点で開始されたようで、元に戻す製品のビルドを作成し、それをdbエラーのある人に提供してどのような影響があるかを確認することを検討していますあります。
プール接続を調整したり、最大待機時間を増やしたりすることでトラブルシューティングに役立つドキュメントを作成しました。ただし、アプリケーションが基本的にアイドル状態の場合でも、多くの人がプール枯渇エラーを報告するようになりました。Ashow full processlist
は、アクティブな1つの接続で「スリープ」状態の19の接続を示しているようです。
私は本番環境と開発環境の両方でアプリケーションを頻繁に実行していますが、問題が発生したことはありません。私は自分のmysql環境を管理するのが得意ですが、より弱いプーリングシステムを備えた競合製品にはそのような問題はありません。
jdbcとプーリングのドキュメントを読むのに多くの時間を費やしましたが、パフォーマンスの低下を引き起こすようなことをしていますか?
これらは、デフォルトで使用しているdb接続コードの例です。
// Called once on application start, connects to the database
public DataSource initDbPool(){
String dns = "jdbc:mysql://"+config.getString("prism.mysql.hostname")+":"+config.getString("prism.mysql.port")+"/"+config.getString("prism.mysql.database");
pool = new DataSource();
pool.setDriverClassName("com.mysql.jdbc.Driver");
pool.setUrl(dns);
pool.setUsername( /*username*/ );
pool.setPassword( /*password*/ );
pool.setInitialSize( 10 );
pool.setMaxActive( 20 );
pool.setMaxIdle( 10 );
pool.setMaxWait( 30000 );
pool.setRemoveAbandoned(true);
pool.setRemoveAbandonedTimeout(60);
return pool;
}
// Called from various classes that need to run queries
public static Connection dbc(){
Connection con = null;
try {
con = pool.getConnection();
} catch (SQLException e) {
System.out.print("Database connection failed. " + e.getMessage());
e.printStackTrace();
}
return con;
}
私もクエリをあまり好きではありません。常にバッチ挿入クエリを実行していますが、キューシステムとバッチ挿入を使用して最適化したため、非常に高速で、オーバーヘッドを最小限に抑えることができます。