こんにちは、すべてのスレッドが Oracle DB で動作するマルチスレッド プログラムを入手しました。では、sqlalchemy は Oracle での並列操作をサポートできますか?
わかりました!
こんにちは、すべてのスレッドが Oracle DB で動作するマルチスレッド プログラムを入手しました。では、sqlalchemy は Oracle での並列操作をサポートできますか?
わかりました!
OCI (オラクル クライアント インターフェイス) には、複数のスレッドを介した同時アクセスが安全であるように、ミューテックスされている接続の効果を持つパラメータ OCI_THREADED があります。これは、ご覧になったドキュメントが参照していた設定である可能性があります。
cx_oracle
は基本的に Python->OCI ブリッジであり、http://cx-oracle.sourceforge.net/html/module.html#cx_Oracle で説明されているキーワード引数「threaded」を使用して、接続関数でこの設定へのアクセスを提供します。接続します。ドキュメントには、「10 ~ 15% のパフォーマンス ペナルティ」が発生するため、デフォルトでは False であると記載されていますが、この情報のソースは示されていません (パフォーマンス統計は、原則として常に疑わしいと見なされる必要があります)。
SQLAlchemy に関する限り、SQLAlchemy でcx_oracle
提供されるダイアレクトはデフォルトでこの値を True に設定し、create_engine() を介してエンジンをセットアップするときに False に戻すオプションがあるため、そのレベルでは問題はありません。
しかしそれ以上に、SQLAlchemy の推奨される使用パターン (つまり、スレッドごとに 1 つのセッション、必要に応じて関数によってチェックアウトされるプールに対して接続をローカルに保持する) は、接続への同時アクセスをどのような場合でも防ぎます。そのため、create_engine() の「スレッド化」設定をオフにして、通常の使用パターンに従っている限り、おそらく具体的なパフォーマンスの向上を享受できます。
各並行スレッドに独自のセッションがある限り、問題はありません。1つの共有セッションを使用しようとすると、問題が発生します。