https://blogs.oracle.com/WebLogicServer/entry/using_oracle_jdbc_type_interfaces
Oracle Database 12cのホットな新機能の一つは、Application Continuity (AC)です。この機能は基本的に発見します。接続が切れたものを裏で新しいものに置き換えるというものです(詳細は別のエントリや記事でお伝えする予定です)。これを実現するために、アプリケーションにはリアルな接続ではなく、接続ラッパーを渡します。インタフェースに基づいたクラスにあわせてのみ、ラッパーもしくは動的プロキシを生成することができます。Oracleのデータ型(REFやARRAYなど)は元々具象なクラスとして導入されました。WebLogic Server 10.3.6とJDBC 11.2.0.3ドライバでは、Oracleデータ型の新しいインタフェースを使って、この新しいAC機能を利用する必要があります。
まず、必要となるAPIの変更を理解するために歴史をひもときましょう。初期のWebLogicデータソースでは、ベンダー独自のメソッドへの任意の参照をハードコードされた参照によって取り扱っていました。メソッドの追加・削除というメンテナンス上の大きな問題がありました。ひどいときには、1000行以上のコードがOracle独自のメソッドを参照し、(DB2しか使っていなくても)Oracle Databaseのjarファイルがクラスパスに存在しないとサーバーが動作しませんでした。2003年3月の8.1で、パブリックインターフェイスのメソッドを実装し、基礎となるベンダーのオブジェクトに委譲するプロキシを動的に生成するようなすべてのJDBCオブジェクトのラッパーを導入しました。ハードコーディングされた参照やメンテナンスの悪夢がなくなり、それと共に重要なのは、デバッグ情報を提供したり、接続リークの発見、コンテナオブジェクトクローズ時にオブジェクトの自動クローズ、テストに失敗した接続の置き換えなどができるようになりました。Oracle Databaseのデータ型は具象クラスなので、WebLogic Serveのベンダーインタフェースであるweblogic.jdbc.vendor.oracle.*を実装するこれらのクラスに対してプロキシを生成します。アプリケーションはWebLogic Serverのベンダーインタフェースへキャストしたり、getVendorObj()を使って下位のドライバオブジェクトへアクセスすることができます。後に、デバッグ情報が不要といった機能の削除に対応するため、データ型を解除するオプションを追加しました。
この記事で取り上げているのはOracle Databaseのデータ型ですが、動的プロキシは任意のベンダーのデータベースで利用できます。例えば、DB2の接続をキャストして独自メソッドを利用することができます。
Oracle DatabaseのJDBCドライバ11.2.0.3から、データベースチームが新しいAC機能のためのラッパーを必要としていたので新しいインタフェースを導入しました。WebLogic Serverのデータソースユーザーにとっては、これはいいニュースです。つまり、unwrappingは不要、weblogic.jdbc.vendorパッケージは不要で、すべて透過的になったのです。プログラムを変更して新しいOracleの独自インタフェースを使う前に、まずは標準のJDBC APIのインタフェースが使えるかどうかを確認することをお勧めします。実際のところ、定義された新しいインタフェースを定義する中で、等価の標準JDBC APIがある場合、もしくはそのメソッドが重要な価値を追加していないと考えられる場合、Oracle独自メソッドが廃止されています。この表でそのマッピングを示しています。目標は、1列目と2列目への参照をなくし、第3列に置き換えることです。((com.ibm.db2.jcc.DB2Connection)conn).setDB2ClientUser("myname");
旧Oracle Database データ型 | 廃止予定のWebLogic Server インタフェース | 新しいインタフェース |
oracle.sql.ARRAY | weblogic.jdbc.vendor.oracle.OracleArray | oracle.jdbc.OracleArray |
oracle.sql.STRUCT | weblogic.jdbc.vendor.oracle.OracleStruct | oracle.jdbc.OracleStruct |
oracle.sql.CLOB | weblogic.jdbc.vendor.oracle.OracleThinClob | oracle.jdbc.OracleClob |
oracle.sql.BLOB | weblogic.jdbc.vendor.oracle.OracleThinBlob | oracle.jdbc.OracleBlob |
oracle.sql.REF | weblogic.jdbc.vendor.oracle.OracleRef | oracle.jdbc.OracleRef |
これらの新しいインタフェースのすべてを説明するために書いたサンプルプログラムを用意しました。以下のリンクからご覧いただけます。
サンプルコード(注意:これは実際のところ".java"プログラムです)このサンプルコードでは、こうしたOracleのデータ型をすべて取り扱っています。 BLOBおよびCLOBの使用はよくあるかもしれませんが、REFやStructあまり使われていないかもしれません。サンプルプログラムでは、各データ型のcreate、insert、updateおよびselectの方法を標準および拡張メソッドの両方を使って説明しています。ご注意いただきたいのは、標準のcreateArrayOf()ではなく、Oracle独自のcreateOracleArray()を使う必要があることです。サンプルプログラムでは標準のcreateBlob()やcreateClob()を使用していませんが、これらは、Oracle JDBCドライバでサポートされています。
https://blogs.oracle.com/WebLogicServer/resource/StephenFeltsFiles/OracleTypes.txt
APIのリファレンスは11.2.0.3のjavadocからご覧いただけます。以下のリンクからもご覧いただけます。
Oracle JDBC API Reference 11g Release 2 ("11.2.0.3.0")これは、Application Continuityの利用にむけた第一歩です。しかし、これはまた、最終的にはなくなるOracle APIを除去して、標準JDBCインタフェース、新しいOracleインタフェースを使う良い動きでもあります。
Package oracle.jdbc
http://download.oracle.com/otn_hosted_doc/jdeveloper/905/jdbc-javadoc/oracle/jdbc/package-summary.html
0 件のコメント:
コメントを投稿