MySQL Connector / JDBCスレッドは安全ですか?
-
06-07-2019 - |
質問
標準のMySQL JDBCドライバーはスレッドセーフですか?具体的には、すべてのスレッドで単一の接続を使用しますが、各ステートメントは単一のスレッドでのみ使用されます。安全なシナリオとそうでないシナリオはありますか?ここでの経験はどうですか?
解決
トランザクションは接続ごとに開始/コミットされます。非常に具体的な作業を行っていない限り(正直に言うと正当化される例は考えられません)、接続プールとスレッドごとの接続の方が良いでしょう。
他のヒント
autocommit = 1の場合、接続へのアクセスが同期されていれば、複数のスレッドが同じ接続を共有することは非常に可能です。 autocommit = 0の場合、コミットが発生するまで、何らかのミューテックスを介して接続へのアクセスを制御する必要があります。
アプリケーションが保持できる接続の量が絶対的に制限されていない限り、接続プールがより実行可能な代替手段になる可能性があります。
最近の経験から、 Connection
オブジェクトはConnector / J 5.1.33ではスレッドセーフではありません。
バグ67760 で説明されているデッドロック状態に陥りました。バグかどうかはわかりませんが、議論からの合理的なアドバイスは次のとおりです。
[2012年12月12日20:33]トッドファーマー
複数のスレッドで単一のConnectionオブジェクトを使用しないでください 適切な同期なし。 Connector / J-さらに重要なことは、 MySQLクライアントサーバープロトコル-同時実行を許可しません 同じConnectionオブジェクトを使用する操作。 Connectionオブジェクトの場合 スレッド間で共有する必要があります、それはの責任です アプリケーションコードの作成者は、操作が適切にシリアル化されるようにします。