1

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;
}

実際のコードはここで見ることができます。

私もクエリをあまり好きではありません。常にバッチ挿入クエリを実行していますが、キューシステムとバッチ挿入を使用して最適化したため、非常に高速で、オーバーヘッドを最小限に抑えることができます。

4

1 に答える 1

2

私が見るように、あなたはブロックclose()内ではありませんが、持っていfinallyます。これは、例外が発生した場合、接続が失われることを意味します。commons-dhcpリークされた接続をと同じように処理しないのではないかと思いjdbc-poolます。

RightThing™であるため、デフォルトでremoveAbandoned構成オプションがあります。offしかし、私が理解しているように、タイムアウトによってそれらを閉じるため、それは保証を与えません。短期間に多くの例外が発生すると、プールが使い果たされる可能性があります。したがって、より良いアプローチは、finallyブロック内のすべての接続を常に閉じることです。

于 2013-03-26T22:27:25.053 に答える