2009-10-07 16 views

答えて

55

JDBCドライバが仕様に準拠している場合、技術的にはオブジェクトはスレッドセーフですが、接続上のアクティビティは1つのスレッドしか実行できないため、スレッド間の接続を共有しないでください一度に何か。

各スレッドが独自の接続を確保するには、接続プール(Apache Commons DBCPなど)を使用する必要があります。

+4

続きを読みます。 –

+1

私の頭の後ろの声で、JDBC仕様ではすべてのjava.sqlオブジェクトがスレッドセーフである必要がありますが、その参照は見つかりません。 – skaffman

+11

あなたの声はhttp://java.sun.com/j2se/1.3/docs/guide/jdbc/spec/jdbc-spec.frame9.htmlを参照してください。「私たちはすべてのjava.sqlオブジェクトはマルチスレッドセーフであり、複数のスレッドが同時に同じオブジェクトを呼び出すことで正しく対処することができます。 – janko

9

java.sql.Connectionはインターフェイスです。したがって、すべてがドライバの実装に依存しますが、一般的には、異なるスレッド間で同じ接続を共有したり、接続プールを使用したりしないようにしてください。また、プール内の接続数がワーカースレッド数よりも多いこともお勧めします。

+7

インタフェースは契約であり、契約*はすべての実装がスレッドセーフでなければならないと指定できます。これは、java.sql.Connectionの場合とは異なります。 –

+1

はい、インタフェースは契約であり、契約を記述するドキュメントにいくつかの追加要件を設けることができますが、java.sql.Connectionのドキュメントではスレッドセーフの要件が定義されていないと述べています。安全は、厳密に記述され強制されるものではありません。実装は依然として契約に違反していることがあります(間違って、場合によっては、例えばIdentityHashMapなど)。 –

+0

@AndreyAdamovich: "プール内の接続数がワーカースレッドの数よりも多いことをお勧めします"なぜですか?私は接続プールで多くの接続がある場合、スラッシングの問題に終わります。 –

0

PooleddatasourceのWebsphere文キャッシュにArrayOutOfBoundsExceptionがあり、そのキャッシュを無効にする必要がありました。

私たちはそれ自体をブロックしていた治療を受けました。

そのすべては、接続への現在のアクセスのため、実際の生活習慣による結論は、あなたがそれをしてはならないということです。

1

は、これはかなり古いスレッドですが、Microsoft SQL Serverをについての答えを探している人のために、ここでの答えである:

SQLServerConnectionは、単一の接続から作成されたが、複数のステートメントをスレッドセーフではありませんが同時スレッドで同時に処理することができます。

SQLServerConnectionは、SQL ServerへのJDBC接続を実装しています。

ステートメントは共有できますが、接続はできません。各スレッドで接続が必要な場合は、スレッドプールを使用できます。

は、スレッドセーフではありませんので、自動コミット・フラグへのアクセスを同期しない例はPostgresの実装についてhere

関連する問題