2009-07-30 1 views
13

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

+3

"スレッド間で接続を共有することができます(特に各スレッドに独自のステートメントがある場合は特にそうです)。通常、JDBC APIはスレッドセーフな方法で使用するようには設計されていませんほとんどのJDBC接続(MySQLを含む)は、一度に1つのクエリしか処理できません。 "http://forums.mysql.com/read.php?39,171022,171195#msg-171195 – Tim

+1

@Tim、Yes、私は以前の記事を見た。しかし、それは起こりそうな問題について詳しくは触れていないので、他の人の経験について聞くのは面白いと感じました。また、スタックオーバーフローの質問データベースに含まれている質問が有効であると感じました。そのリンクを回答として投稿してください。 :) –

+1

代わりに接続プールを使用することを検討してください。 –

答えて

8

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

+1

ある種のフォーク/ジョイン・アルゴリズム(cf http://www.ibm.com/developerworks/java/library/j-jtp11137.html)を実行する可能性のあるユース・ケースがあるかもしれないが、 1つのトランザクションであるため、接続を開いて元のスレッドでトランザクションを開始し、これをすべてのタスク実行プログラムに渡してから、すべての参加が完了した後に元のスレッドでコミットすることができます。 –

+0

例:データを相互に関係がある複数のテーブルに 'load data local infile'を使用してストリーミングデータを挿入し、安価に2回繰り返すことはできません。 –

4

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

アプリケーションが持つ接続の量に限りがある場合を除き、接続プールはより実用的な方法です。

0

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

私はbug 67760で説明したデッドロックの状況に遭遇しました。それはバグであるかどうかわからしかし、議論から1つの合理的なアドバイスをしていない:

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

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

+0

FYI、このバグは5.1.37で修正されているはずです。 – Archie

関連する問題