C 3 P 0マルチスレッドでのmaxPoolSize構成
2286 ワード
ETLツールの完成の差は多くなくて、今日1つの問題に出会って、C 3 P 0にmaxPoolSizeを10に配置して、目的は全体の応用が同時に獲得する最大のConnection個数を10にしたいので、しかし応用のこの部分をテストした後に、PostgreSQL端のリンクが10をはるかに超えることを発見します.ツールはマルチスレッドなので、マルチスレッドではないかと思い、Connectionの個数を調べてみると、確かに10*スレッド個数でした.そこでテストを行いました
maxPoolSizeを5に設定し、次のプログラムを実行します.
maxPoolSizeは、合計20個のリンクを取得するように構成されています.この場合、PostgreSQLサーバ側の接続数は5で、正式に予想される結果が表示されます.
次のプログラムを実行します.
2つのスレッドで、各スレッドが10個のリンク数を取得しようとすると、PostgreSQLサーバ側のリンク数が10個表示されます.i<2をi<3に変更し、一度実行すると、PostgreSQLサーバ側の接続数が15であることを確認します.
次のテストを行います.
3つのスレッドを作成するには、各スレッドに10個のConnectionが必要です.この場合、PostgreSQLサーバ側の接続数は5であることがわかります.PostgreSQLサーバ側のリンクの数は、クライアントが作成したCombooledDataSourceインスタンスの数に比例し、C 3 P 0プロファイルで構成されている容量は、1つのCombooledDataSourceインスタンスに対する制限です.
結論:
下層の原因は多分C 3 P 0がマルチスレッドのために設計されたのではなく、下層JDBCでもスレッドが安全ではないからである.具体的な原因は、具体的に分析する機会がある.
1つのアプリケーションでは、一般的に1つのデータ・ソースに1つのCombooledDataSourceオブジェクト、すなわちCombooledDataSourceインスタンスしか使用されません.
maxPoolSizeを5に設定し、次のプログラムを実行します.
ComboPooledDataSource cpds = new ComboPooledDataSource("postgres");
for (int i = 0; i < 10; i++) {
cpds.getConnection();}
ComboPooledDataSource cpds2 = new ComboPooledDataSource("postgres");
for (int i = 0; i < 10; i++) {
cpds2.getConnection();}
maxPoolSizeは、合計20個のリンクを取得するように構成されています.この場合、PostgreSQLサーバ側の接続数は5で、正式に予想される結果が表示されます.
次のプログラムを実行します.
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
ComboPooledDataSource cpds = new ComboPooledDataSource("postgres");
for (int i = 0; i < 10; i++) {
try {
cpds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "Thread" + i).start();
}
2つのスレッドで、各スレッドが10個のリンク数を取得しようとすると、PostgreSQLサーバ側のリンク数が10個表示されます.i<2をi<3に変更し、一度実行すると、PostgreSQLサーバ側の接続数が15であることを確認します.
次のテストを行います.
final ComboPooledDataSource cpds = new ComboPooledDataSource("postgres");
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
cpds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "Thread" + i).start();
3つのスレッドを作成するには、各スレッドに10個のConnectionが必要です.この場合、PostgreSQLサーバ側の接続数は5であることがわかります.PostgreSQLサーバ側のリンクの数は、クライアントが作成したCombooledDataSourceインスタンスの数に比例し、C 3 P 0プロファイルで構成されている容量は、1つのCombooledDataSourceインスタンスに対する制限です.
結論:
下層の原因は多分C 3 P 0がマルチスレッドのために設計されたのではなく、下層JDBCでもスレッドが安全ではないからである.具体的な原因は、具体的に分析する機会がある.
1つのアプリケーションでは、一般的に1つのデータ・ソースに1つのCombooledDataSourceオブジェクト、すなわちCombooledDataSourceインスタンスしか使用されません.