8

私のアプリケーションは、複数のスレッドで複数のクエリを実行します。Apache DBCPを使用したマルチスレッド

今はすべてのクエリに対して新しい接続を作成しています。効率を向上させるためにプールを使用したいと考えています。

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

ブロックすると、別のものを使用できますか?この記事で

UPDATE:linkは次のように述べています

をすべてのOracle JDBC APIメソッドが同期化されているので二つのスレッド が同時に接続オブジェクトを使用しようとすると、その後1は になります他の人が使用を終えるまで待たされました。

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

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

+1

以下の大きな回答を補足するために、 'getConnection()'がブロックする唯一の時間はプールに 'Connection'がもうない場合です。しかし、トランザクションが完了するとすぐに、 'Connection'がプールに返され、' getConnection() 'は有効な' Connection'インスタンスを返します。これらのすべては、プールの構成によって異なります。 – Jeach

答えて

2

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

並行処理のシナリオは、一般的なApache DBCPなど、サーバー側のプーリングで大きな問題となります。ですから、私はDBCPがマルチスレッドでうまく動作すると思いますが、ライブラリに深く入り込むことはありません。

Apache DBCPはJDBC接続を提供するだけで、クライアントコードはConnectionインスタンスを正しいマルチスレッドで使用しなければならないDBCPは保証できません。

+0

私は正しいかどうかはわかりませんが、接続が返されるPreparedStatementのメソッドのいくつかは同期していると思います。そうであれば、接続はスレッドごとにブロックされます... – user1658192

+0

JDBCでは 'Connection'または 'Statement'のメソッドが同期されていません。 –

+0

したがって、各スレッドが異なるクエリを実行する複数のスレッドで同じ接続を使用しても問題はありませんか? – user1658192

4

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

+0

効率を改善するためのスレッド。現在、各スレッドは独自の接続を作成しています。 – user1658192

+0

@ user1658192なぜ、Connectionインスタンスを共有するのではなく、DBCPデータソースからgetConnection()を呼び出してみませんか? –

+0

getConnection()を呼び出すと、同じ接続がすでに他のスレッドによって使用されている間に何が起こりますか?投票で新しい接続が作成されますか? – user1658192

関連する問題