Java >> Java チュートリアル >  >> Tag >> Jdbc

複数のスレッドによる同じ JDBC 接続の同時使用

AWS RDS Postgres データベースと Java 11 を使用して、次の一連のテストを実行しました:

<オール> <リ>

1,100 万行のテーブルを作成します。各行には 1 つの TEXT 列が含まれ、ランダムな 100 文字の文字列が入力されます

<リ>

ランダムに 5 文字の文字列を選択し、この文字列の部分一致を上記の表で検索します

<リ>

上記のクエリが結果を返すのにかかる時間。私の場合、約23秒かかります。返される結果がほとんどないため、この 23 秒の大部分は、リクエスト/レスポンス パケットの送信ではなく、DB がフル テーブル スキャンを実行するのを待つために費やされていると結論付けることができます

<リ>

異なる接続を使用して、(異なるキーワードで) 複数のクエリを並行して実行します。私の場合、それらはすべて約 23 秒で完了することがわかります。つまり、クエリは効率的に並列化されています

<リ>

同じ接続を使用して、並列スレッドで複数のクエリを実行します。最初の結果が 23 秒以内に返されることがわかりました。 2 番目の結果は ~46 秒で返されます。約 1 分で 3 番目。などなど。すべての結果は、そのスレッドによって照会された特定のキーワードと一致するという点で、機能的に正しいです

Joni が先に述べたことに付け加えると、彼の結論は、私が Postgres で見た動作とも一致します。複数のクエリが同じ接続で同時に送信されると、すべての「正確性」が保持されるように見えますが、並列処理の利点はすべて失われます。


JDBC 仕様では同時実行が保証されていないため、この質問は、関心のあるドライバーをテストするか、そのソース コードを読むことによってのみ回答できます。

MySQL Connector/J の場合、すべてのメソッドが execute に ステートメントは synchronized で接続をロックします ブロック。つまり、1 つのスレッドがクエリを実行している場合、その接続を使用している他のスレッドは、それが終了するまでブロックされます。


Java タグ