[WLS] Using Oracle JDBC Type Interfaces

原文はこちら。
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の接続をキャストして独自メソッドを利用することができます。
((com.ibm.db2.jcc.DB2Connection)conn).setDB2ClientUser("myname");
Oracle DatabaseのJDBCドライバ11.2.0.3から、データベースチームが新しいAC機能のためのラッパーを必要としていたので新しいインタフェースを導入しました。WebLogic Serverのデータソースユーザーにとっては、これはいいニュースです。つまり、unwrappingは不要、weblogic.jdbc.vendorパッケージは不要で、すべて透過的になったのです。プログラムを変更して新しいOracleの独自インタフェースを使う前に、まずは標準のJDBC APIのインタフェースが使えるかどうかを確認することをお勧めします。実際のところ、定義された新しいインタフェースを定義する中で、等価の標準JDBC APIがある場合、もしくはそのメソッドが重要な価値を追加していないと考えられる場合、Oracle独自メソッドが廃止されています。この表でそのマッピングを示しています。目標は、1列目と2列目への参照をなくし、第3列に置き換えることです。
旧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
これは、シェルハッカーのための仕事です!ほとんどは自動化することができ、廃止されたメソッドを参照している場合には、コンパイラが知らせてくれますので、その後なくなったメソッドが等価のjdbc.sqlインタフェースにあるかどうか確認して下さい(例えば、getARRAY()はJDBC標準のgetArray()になります)。
これらの新しいインタフェースのすべてを説明するために書いたサンプルプログラムを用意しました。以下のリンクからご覧いただけます。
サンプルコード(注意:これは実際のところ".java"プログラムです)
https://blogs.oracle.com/WebLogicServer/resource/StephenFeltsFiles/OracleTypes.txt
このサンプルコードでは、こうしたOracleのデータ型をすべて取り扱っています。 BLOBおよびCLOBの使用はよくあるかもしれませんが、REFやStructあまり使われていないかもしれません。サンプルプログラムでは、各データ型のcreate、insert、updateおよびselectの方法を標準および拡張メソッドの両方を使って説明しています。ご注意いただきたいのは、標準のcreateArrayOf()ではなく、Oracle独自のcreateOracleArray()を使う必要があることです。サンプルプログラムでは標準のcreateBlob()やcreateClob()を使用していませんが、これらは、Oracle JDBCドライバでサポートされています。
APIのリファレンスは11.2.0.3のjavadocからご覧いただけます。以下のリンクからもご覧いただけます。
Oracle JDBC API Reference 11g Release 2 ("11.2.0.3.0")
Package oracle.jdbc
http://download.oracle.com/otn_hosted_doc/jdeveloper/905/jdbc-javadoc/oracle/jdbc/package-summary.html
これは、Application Continuityの利用にむけた第一歩です。しかし、これはまた、最終的にはなくなるOracle APIを除去して、標準JDBCインタフェース、新しいOracleインタフェースを使う良い動きでもあります。

0 件のコメント:

コメントを投稿