C 3 P 0マルチスレッドでのmaxPoolSize構成

2286 ワード

ETLツールの完成の差は多くなくて、今日1つの問題に出会って、C 3 P 0にmaxPoolSizeを10に配置して、目的は全体の応用が同時に獲得する最大のConnection個数を10にしたいので、しかし応用のこの部分をテストした後に、PostgreSQL端のリンクが10をはるかに超えることを発見します.ツールはマルチスレッドなので、マルチスレッドではないかと思い、Connectionの個数を調べてみると、確かに10*スレッド個数でした.そこでテストを行いました
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インスタンスしか使用されません.