連載目次
cx_Oracle 8.2リリース
cx_Oracle 8.2がリリースされました。
本記事ではリリースノートを元に、cx_Oracle 8.2の新機能、変更点などを解説します。
今回は大きな変更が入りますのでご注意ください。
この記事は英語のRelease Noteを元にまとめたものとなります。
なお、既存のcx_Oracleのアップグレードは、python -m pip install cx_Oracle --upgrade
で実施します。
1. PEP8準拠
関数名がPEP8準拠になるよう変更されました。過去PEP8に適合していなかった関数名が変更されます。変更される関数の一覧と、変更後の関数名の表がこちらにて参照可能です。
8.2では8.1までの関数名も使用可能ですが、旧関数名は将来バージョンのcx_Oracleにて廃止される予定ですので、8.2以降をお使いの場合は新関数名を使用するようにしてください。
2. ODPI-C 4.2.0対応
cx_Oracle 8.2は、ODPI-Cのバージョン4.2.0をベースに作成されています。
3. コネクション・プールに関する機能追加
以下の機能が追加されています。
- cx_Oracle.SessionPool()にmax_sessions_per_shardパラメータを追加。シャードごとのコネクションプールの最大接続数を指定します。また、設定値はSessionPool.max_sessions_per_shard属性で確認が可能です。これらの機能を使用するためにはOracle Client18.3以上が必要です。
- cx_Oracle.SessionPool()にstmtcachesizeパラメータを追加。ステートメントキャッシュに保存できる分の数を指定します。なお、このパラメータは、cx_Oracle.connect()にも追加されています。
- cx_Oracle.SessionPool()にping_interval パラメータを追加。プールされた接続を取得する際のpingの間隔を指定します。また、設定値はSessionPool.ping_interval属性で確認が可能です。なお、8.1以前のcx_Oracleではping間隔は60秒固定でした。
- cx_Oracle.SessionPool()にsoda_metadata_cacheパラメータを追加。SODAメタデータキャッシュの機能が利用できるようになります。また、SessionPool.soda_metadata_cache属性を追加し、セッションプール作成後に調整できるようにしました。この機能により、SodaDatabase.createCollection() (metadata パラメータに値を指定しない場合)および SodaDatabase.openCollection() メソッドのパフォーマンスが大幅に向上します。SODAメタデータキャッシュを使用するためにはOracle Clientバージョン21.3以降(またはOracle Client 19 19.11以降)が必要です。
4. SODAにヒント機能追加
SODAの操作に関するヒントの機能を提供するhint()メソッドが追加されました。また、SodaCollection.insertOneAndGet(), SodaCollection.insertManyAndGet(), SodaCollection.saveAndGet()の各メソッドにhintパラメータが追加されました。これらの機能を使用するためにはOracle Clientバージョン21.3以降(またはOracle Client 19 19.11以降)が必要です。
5. 文字コード関連の仕様変更
- cx_Oracle 8.0でUTF-8以外のエンコーディングが非推奨となったのを受け、cx_Oracle.connect()やcx_Oracle.SessionPool()のencondingパラメータやnencodingパラメータが非推奨となりました。
- cx_Oracle 8.0でUTF-8以外のエンコーディングが非推奨となったのを受け、Connection.maxBytesPerCharacter属性が非推奨となりました。代わりに4バイトを定数として使用してください。
- issue 385への対応として、Cursor.var()にパラメータbypass_decodeを追加しています。Oracle DatabaseとPythonの間の文字列変換の際にデコードステップをバイパスする機能です。
6. デッド・コネクション検出強化
エラーによって接続が使用できなくなった場合、エラー「DPI-1080: connection was closed by ORA-%d」が返されるようになりました。メッセージ内の「%d」は、接続を閉じる原因となったORAエラーです。この後に接続を使用すると、「DPI-1010: 接続されていません」というエラーになります。この動作は、使用できない接続になる Connection.call_timeoutのエラーにも適用されます。
7. メモリリークエラー修正
SodaOperation.filter()をディクショナリで呼び出した際のメモリリークを修正しました。
8. 分散トランザクションのクリア
issue 530への対応として、接続に関連付けられた分散トランザクションのハンドルは、Commit/Rollback時にクリアされるようになりました。
9. 一時LOBの型チェック
変数やオブジェクトの属性を設定する際に、一時LOBの型が期待される型と一致していることを確認するチェックを追加しました。
10. テストスイートの改良
具体的な改良点はリリースノートに記載されていません。