web-dev-qa-db-ja.com

Java.sql.Connectionスレッドは安全ですか?

質問を言い換えると、異なるスレッド間でJava.sql.Connectionを実装するクラスのインスタンスを共有することを避けるべきですか?

60
Boris Pavlović

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

接続プール( Apache Commons DBCP など)を使用して、各スレッドが独自の接続を取得するようにします。

65
skaffman

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

11

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

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

そして

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

上記のすべてから、Connectionsではなくステートメントを共有できます。各スレッドで接続が必要な場合は、スレッドプールを使用できます。

続きを読む こちら

4
Hanash Yaslem

Oracle JDBCおよびマルチスレッド docs:

すべてのOracle JDBC APIメソッドは同期されているため、2つのスレッドが接続オブジェクトを同時に使用しようとすると、一方のスレッドが他方のスレッドの使用を完了するまで待機する必要があります。

したがって、Oracleの場合は安全かもしれませんが、同時アクセスはボトルネックの影響を受けます。

2
Vadzim

PooleddatasourceのWebsphereステートメントキャッシュにArrayOutOfBoundsExceptionがあり、そのキャッシュを無効にする必要がありました。

自分自身をブロックする治療を受けました。

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

1
Mirak