10

私のアプリケーションは、複数のスレッドで複数のクエリを実行します。

現在、すべてのクエリに対して新しい接続を作成しており、プールを使用して効率を向上させたいと考えています。

Apache DBCP プールは複数のスレッドで同時に動作できますか? または、スレッドごとにいくつかの同期されたメソッドで「ブロック」されますか?

ブロックされた場合、他のものを使用できますか?

アップデート

この記事では:リンクは次のように 述べています:

すべての Oracle JDBC API メソッドが同期されるため、2 つのスレッドが接続オブジェクトを同時に使用しようとすると、一方は他方が使用を終了するまで待機することを余儀なくされます。

だから私はDBCPがそれに対処できないと思いますか?

また、このシナリオではプールが役に立たないことも認識しています。これは、各スレッドが接続を要求し、スレッドが毎回新しい接続を生成するためです (一部のスレッドが終了して接続をプールに返すまで)。

4

2 に答える 2

4

スレッドはプールから接続を取得し、それが完了するまで排他的に使用します。他のスレッドと接続を共有しません。完了すると、接続がプールに返されます (通常、接続は close メソッドをオーバーライドしてプールに返します)。利点は、使用するたびに接続を再作成する必要がないことです。ただし、データベース接続を同時に使用する複数のスレッドを持つべきではありません。

于 2012-09-11T15:05:29.547 に答える
2

はい、Apache DBCP はマルチスレッドで同時に動作できます。「ブロック」は、クライアント コードgetConnection()が競合状態で正しい動作を保証する場合に発生します。たとえば、1 つのインスタンスが 2 つの同時要求Connectionによって取得されるべきではありません。getConnection()その後、クライアント コードがConnectionインスタンスを処理します。

並行シナリオは、一般的な Apache DBCP などのサーバー側プーリングで大きな懸念事項です。そのため、DBCP はマルチスレッドで適切に動作すると思いますが、ライブラリについて深く掘り下げることはしません。

また、Apache DBCP は JDBC 接続プーリングを提供するだけです。クライアント コードは、ConnectionDBCP が保証できない正しいマルチスレッドの方法でインスタンスを使用する必要があります。

于 2012-09-09T14:13:53.150 に答える