連載目次
はじめに
第1回でも簡単に触れていますが、本記事ではpython-oracledbで新たに追加されたThin Modeと、従来型(python-oracledbの前身のCx_Oracle)と同様のThick Modeの違いと使い分けについて解説します。
Thin ModeとThick Modeの位置づけ
Thin ModeはCx_Oracleからpython-oracledbにリニューアルした際の最大の目玉機能で、Oracle JDBC Thin Driverのように、Oracle Databaseの接続のためにOracle Clientが不要になりました。この対応により、従来のようにOracle Istant/Thick Clientを用意せずともpython-oracledbのみで接続できるようになりました。ただし、Thick Modeと呼称していますが、従来通りOracle Clientを必要とする接続も可能です。インストール要件に関しては第二回を参照してください。
Thin ModeとThick Modeのコーディング上の違い
両モードともインポートするモジュール名も基本的なコーディングも同じです。python-oracledbは新機能とインポートするモジュール名を除けば前身のCx_Oracleとコーディングは同じです。どちらのドライバもPython Database API v2.0に準拠しています。ただし、これらの対応プラス、ドライバの変更のみの対応が可能なのはThin Modeになります。実質的にThin Modeがデフォルトのモードとなります。
Thick Modeを利用したい場合、コーディングの追加が必要です。この対応がないとOracle ClientがインストールされていてもThin Modeで動きます。
Thick Modeで稼働させたい場合、以下のように接続の処理よりも前にinit_oracle_client()を呼び出す必要があります。
import oracledb
oracledb.init_oracle_client()
# この後にDB接続やSQLの処理を記述
上記の記述はOracle Instant Clientがpython-oracledb実行アプリケーションが配置されているディレクトリに存在しているか、LinuxやMacの場合、LD_LIBRARY_PATHやDYLD_LIBRARY_PATHなどに記述されているディレクトリに存在していることが前提となります。この前提から外れる場合は、oracledb.init_oracle_client(lib_dir=r"C:\instantclient_19_18")
といったように、lib_dirオプションにOracle Clientのインストールディレクトリを指定する必要があります。
どのような場合にThick Modeを使用するか
Cx_Oracleベースのアプリケーションをpython-oracledb上で動かした場合はThin Modeで動きます。この仕様もあり、基本的にはThick Modeは使用しません。Thick Modeが必要なのは、Oracle Clientがないと利用できない機能を利用するためとなります。大きくは以下の3つの場面となります。
- Oracle Client向けの環境変数を使用したい
特にCx_Oracleで作成されたアプリケーションを移行する場合、特定のOracle Client向けの環境変数を参照している場合もあるかと思われます。Thin ModeではTNS_ADMINとORA_SDTZ以外の環境変数はサポートされていません。ただ、Thin Modeでは上記以外の環境変数を使用する意味はあまりないので、あまり問題にならない可能性も考えられます。 - TAF(Transparent Application Failover)
TAFは、tnsnames.oraに設定するだけで、RAC環境において接続先ノードダウン時に自動で生存ノードに接続を切らずに切り替え、設定次第ではSELECT処理を自動継続してくれる機能です。この機能はOracle Clientがないと利用できません。しかし、今ではTransparent Application Continuity(TAC)という、サーバー側の設定だけで利用でき、更新系SQLの自動再実行も可能な、より上位の機能が存在します。python-oracledbでもTACは利用可能なため、むしろThin ModeでTACを利用しましょう。 - oraaccess.xml
oraaccess.xmlはクライアントサイドの結果セットキャッシュやフェッチサイズなど、本来はコーディングで行うOracle Databaseの一部の機能の設定をXMLファイルに定義することで、コーディングを伴わずにこれらの機能の利用を可能にするものです。このファイルを利用するためにはOracle Clientが必要です。現状、Thick Modeを使用する価値があるのはこのファイルを使用したい場合くらいですが、Thin Modeで類似機能を作りこむことも可能かと思われます。