0

select ステートメントのみを実行する (CRUD を実行しない) 複数のスレッドに同じ接続を割り当てた場合、このシナリオはスレッドセーフですか? 各スレッドは、同じ接続から独自の準備済みステートメントを作成し、それを実行します。各スレッドは結果セットと準備済みステートメント オブジェクトの独自のインスタンスを処理するため、スレッド セーフに見えますが、それでもデータベースへの同じ接続を使用しています。特に Oracle JDBC ドライバーの動作に関心があります。前もって感謝します。

4

3 に答える 3

4

Oracleのドキュメントでは、マルチスレッドアクセスは禁止されていません。代わりに、「複数のスレッドが接続を共有する必要がある場合は、統制のとれた使用開始/使用終了プロトコルを使用してください」というステートメントでそれを許可します。

この注意は、一方のスレッドが自身のデータを挿入/更新し、コミットまたはロールバックを発行するときに、一方のスレッドが挿入/更新およびコミット/ロールバックするという問題のあるケースが原因である可能性があると思います

ただし、元の投稿者の場合、すべてのスレッドはselectステートメントのみを発行します...それでもresultset.next()はデータベースに移動し、データベースへの同じtcp/ipストリームを使用して行を取得します...これが混乱の始まりです..。。

'select-only'の場合、動作は未定義です。

于 2012-11-30T14:59:25.467 に答える
2

私はartoundをグーグルで検索し、これを見つけました:

『Oracle® Database JDBC開発者ガイドおよびリファレンス』 JDBCとマルチスレッド

「Oracle JDBC ドライバーは、Java マルチスレッドを使用するアプリケーションを完全にサポートし、高度に最適化されています。接続キャッシュによって提供されるような、接続への制御されたシリアル アクセスは必要であり、推奨されます。しかし、Oracle は、複数のスレッド間のデータベース接続。複数のスレッドが接続に同時にアクセスできるようにしないでください。複数のスレッドが接続を共有する必要がある場合は、統制された使用開始/使用終了プロトコルを使用してください。

また、データベースを更新するときは、トランザクションの分離が正しく機能するように更新接続から読み取る必要があることに注意してください。

私の知る限り、プールから接続を取得するプロセスは比較的安価です。

- 編集

サーバーへの接続数が気になる場合は、「Oracle 接続マネージャー」を参照してください。

「Oracle Connection Managerは、単一のネットワーク接続を介して複数のクライアント・データベース・セッションを「ファネル」する接続コンセントレータとして機能することにより、多数のユーザーが単一のサーバーに接続できるようにします。」

于 2012-11-30T13:25:17.163 に答える
1

jdbc 仕様では Connections がスレッドセーフである必要がある (ステートメント/結果セットではない) ことは確かなので、これでうまくいきます。ただし、一部の jdbc ドライバーの実装は、共有接続では効率が低下するため、十分なパフォーマンスが得られるかどうかを確実にテストする必要があります。そうでない場合は、複数の接続に切り替える必要がある場合があります。

于 2012-11-30T13:28:16.953 に答える