質問

標準のMySQL JDBCドライバーはスレッドセーフですか?具体的には、すべてのスレッドで単一の接続を使用しますが、各ステートメントは単一のスレッドでのみ使用されます。安全なシナリオとそうでないシナリオはありますか?ここでの経験はどうですか?

役に立ちましたか?

解決

トランザクションは接続ごとに開始/コミットされます。非常に具体的な作業を行っていない限り(正直に言うと正当化される例は考えられません)、接続プールとスレッドごとの接続の方が良いでしょう。

他のヒント

autocommit = 1の場合、接続へのアクセスが同期されていれば、複数のスレッドが同じ接続を共有することは非常に可能です。 autocommit = 0の場合、コミットが発生するまで、何らかのミューテックスを介して接続へのアクセスを制御する必要があります。

アプリケーションが保持できる接続の量が絶対的に制限されていない限り、接続プールがより実行可能な代替手段になる可能性があります。

最近の経験から、 Connection オブジェクトはConnector / J 5.1.33ではスレッドセーフではありません。

バグ67760 で説明されているデッドロック状態に陥りました。バグかどうかはわかりませんが、議論からの合理的なアドバイスは次のとおりです。

  

[2012年12月12日20:33]トッドファーマー

     

複数のスレッドで単一のConnectionオブジェクトを使用しないでください   適切な同期なし。 Connector / J-さらに重要なことは、   MySQLクライアントサーバープロトコル-同時実行を許可しません   同じConnectionオブジェクトを使用する操作。 Connectionオブジェクトの場合   スレッド間で共有する必要があります、それはの責任です   アプリケーションコードの作成者は、操作が適切にシリアル化されるようにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top