![]() ![]() ![]() ![]() |
以下の節では、サード パーティ JDBC ドライバの設定および使用方法について説明します。
Oracle Thin Driver などのサード パーティ Type 4 ドライバを使用してデータベース接続を取得する方法について以下の節で説明します。接続を確立するには、DataSource オブジェクトと JNDI ルックアップを使用することをお勧めします。
まず、Administration Console を使用してデータ ソースを作成し、次に JNDI ルックアップを使用して接続を確立します。
JNDI を使用してデータ ソースにアクセスするには、まずサーバの URL を指定して JNDI ツリーから Context オブジェクトを取得し、次にその Context オブジェクトと DataSource 名を使用してルックアップを実行します。
たとえば、Administration Console で定義された「myDataSource
」という DataSource にアクセスするには、以下のようにします。
Context ctx = null;
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL,
"t3://hostname:port");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
ctx = new InitialContext(ht);
javax.sql.DataSource ds
= (javax.sql.DataSource) ctx.lookup ("myDataSource");
conn = ds.getConnection();
// これで conn オブジェクトを使用して
// 文を作成し、結果セットを検索できる
stmt = conn.createStatement();
stmt.execute("select * from someTable");
rs = stmt.getResultSet();
...
//できる限り速やかに JDBC オブジェクトをクローズする
stmt.close();
stmt=null;
conn.close();
conn=null;
}
catch (Exception e) {
// エラー発生
log message;
}
finally {
try {
ctx.close();
} catch (Exception e) {
log message; }
try {
if (rs != null) rs.close();
} catch (Exception e) {
log message; }
try {
if (stmt != null) stmt.close();
} catch (Exception e) {
log message; }
try {
if (conn != null) conn.close();
} catch (Exception e) {
log message; }
}
(hostname
は WebLogic Server が稼働するマシンの名前、port
はそのマシンにおいて接続リクエストをリスンするポートの番号です)。
この例では、Hashtable オブジェクトを使って、JNDI ルックアップに必要なパラメータを渡しています。JNDI ルックアップを実行する方法は他にもあります。詳細については、『WebLogic JNDI プログラマーズ ガイド』を参照してください。
ルックアップの失敗を捕捉するために JNDI ルックアップが try/catch
ブロックで包まれている点、コンテキストが finally
ブロックの中で閉じられている点に留意します。
注意 : | どうしても必要な場合以外は、物理的な JDBC 接続へ直接アクセスすることはお勧めしません。「データ ソースからの物理的な接続の取得」を参照してください。 |
一般的には、WebLogic Sever によって提供される汎用 JDBC 接続 (ラップされた物理的な接続) に対する接続のキャストを行います。これにより、サーバ インスタンスは接続プールに対する接続の管理、接続プール機能の有効化、およびアプリケーションに提供される接続の品質維持ができるようになります。場合によっては、DBMS ベンダは物理的な接続 (実際のベンダの JDBC 接続) の直接アクセスを必要とする、標準以外の追加の JDBC 関連クラスを提供していることがあります。接続プール内の物理的な接続に直接アクセスするには、getVendorConnection を使用して接続をキャストする必要があります。
物理的なデータベース接続を取得するには、最初に「JNDI ルックアップを使用して接続を取得する」の説明に従って接続プールから接続を取得してから、次のいずれかを実行します。
物理的なデータベース接続の直接アクセスは、常にベンダ固有の呼び出しの場合に限定します。それ以外のすべての状況では、WebLogic Server によって提供される汎用 JDBC 接続を使用します。ベンダ固有の呼び出しに対する接続を開くサンプル コードを、コード リスト 5-2 で示します。
//この追加クラスと、必要なベンダのパッケージを
//インポートする
import weblogic.jdbc.extensions.WLConnection
.
.
.
myJdbcMethod()
{
// 接続プールからの接続は、クラス メソッドやインスタンス メソッド
// ではなく、常にメソッド レベルの変数とする
Connection conn = null;
try {
ctx = new InitialContext(ht);
// JNDI ツリーでデータ ソースをルックアップして、
// 接続を要求する
javax.sql.DataSource ds
= (javax.sql.DataSource) ctx.lookup ("myDataSource");
// プールされた接続は常に try ブロックで取得する。取得した
// 接続は完全に使用し、必要に応じて finally ブロックで
// 閉じる
conn = ds.getConnection();
// WLConnection インタフェースにconn
オブジェクトをキャストして、
// 基底の物理的な接続を取得できる
java.sql.Connection vendorConn =
((WLConnection)conn).getVendorConnection();
// vendorConn は閉じない
// 次のように、vendorConn オブジェクトをベンダのインタフェースに
// キャストすることもできる。次に例を示す
// oracle.jdbc.OracleConnection vendorConn = (OracleConnection)
// ((WLConnection)conn).getVendorConnection()
// ベンダ固有のメソッドで物理的な接続が必要に
// なる場合、物理的な接続を取得または保持するのではなく、
// 必要に応じて暗黙的に渡すほうがよい
// 次に例を示す //vendor.special.methodNeedingConnection(((WLConnection)conn)).getVendorConnection());
JDBC での作業が完了したら、論理的な接続を閉じて、プールに戻す必要があります。物理的な接続を使い終わったら、次の操作を行います。
接続をどのように閉じるかは、Administration Console で [影響のある接続の削除を有効化] プロパティの値を設定して指定します。これらのオプションの詳細については、Administration Console オンライン ヘルプの「JDBC データ ソース : コンフィグレーション : 接続プール」ページ、または『WebLogic Server MBean リファレンス』の「JDBCConnectionPoolParamsBean」を参照してください。
注意 : | [影響のある接続の削除を有効化 ] プロパティは、明示的に getVendorConnection を呼び出すアプリケーションに対してのみ適用されます。 |
// ベンダ固有の呼び出しの使用が完了したら、
// 接続への参照を即座に破棄する
// 参照は保持したり閉じたりしない
// 汎用 JDBC にはベンダ接続を使用しない
// 標準の JDBC には、論理的な (プールされた) 接続を使用する
vendorConn = null;
... do all the JDBC needed for the whole method...
// 論理的な (プールされた) 接続を閉じて
// 接続プールに戻し、参照を破棄する
conn.close();
}
conn = null;
catch (Exception e)
{
// 例外を処理する
}
finally
{
// 念のため、論理的な (プールされた) 接続が閉じられているか
// どうか確認する
// 常に finally ブロックの最初の処理として
// 論理的な (プールされた) 接続を閉じる
if (conn != null) try {conn.close();} catch (Exception ignore){}
}
}
[影響のある接続の削除を有効化] が true (デフォルト値) のときに論理的な接続を閉じると、サーバ インスタンスは基底の物理的接続を破棄して、それに取って代わる新しい接続を作成します。このアクションで、プールは次のユーザに対して、そのユーザがプール接続の唯一のユーザであることを確実に保証できるようになります。このコンフィグレーションにより、接続を閉じるための簡単で安全な方法がもたらされます。ただし、以下の理由により、パフォーマンス上の損失が生じます。
注意 : | [影響のある接続の削除を有効化 ] を false で使用するのは、公開されている物理的な接続が、論理的な接続を閉じた後、保持または再利用されることが絶対にないと確信している場合のみです。 |
[影響のある接続の削除を有効化] が false のときに論理的な接続を閉じると、サーバ インスタンスは単に物理的な接続を、再利用のために接続プールに返します。このコンフィグレーションでは、パフォーマンス上の損失は最小限に抑えられますが、サーバ インスタンスは、接続の品質や、論理的な接続が閉じられた後の接続管理の効率を保証はしません。接続が接続プールに返される前に、その接続が他のアプリケーションによる再利用に適していることを確認する必要があります。
接続プールの論理的な接続の代わりに物理的な接続を使用することはお勧めしません。ただし、たとえば STRUCT の作成などに、物理的な接続を使用する必要がある場合は、以下の負担と制限を考慮してください。
一部のデータベース ベンダでは、DBMS を使用するデータベースのデータを操作するための独自のメソッドが追加されています。これらのメソッドは、標準の JDBC インタフェースを拡張したものです。以前のバージョンの WebLogic Server では、一部のベンダの特定の JDBC 拡張機能だけがサポートされていました。現在のリリースの WebLogic Server は、ベンダの JDBC ドライバでパブリック インタフェースとして公開されているすべての拡張機能メソッドをサポートします。
ドライバのベンダが必要なメソッドをパブリック インタフェースで公開していない場合は、そのメソッドをパブリック インタフェースで公開するようにベンダにリクエストを提出してください。ARRAY、STRUCT、および REF に対する Oracle Thin Driver の拡張機能メソッドはパブリック インタフェースとして公開されていませんが、WebLogic Server ではこれらの拡張機能メソッドをサポートしています。「Oracle 拡張機能と Oracle Thin Driver の使用」を参照してください。
一般に、WebLogic Server はベンダ拡張機能のサーバサイド コードでの使用をサポートしています。ベンダ拡張機能をクライアントサイド コードで使用するには、オブジェクト型またはデータ型がシリアライズ可能でなければなりません。これに対する例外として、以下のオブジェクト型があります。
これらのオブジェクト型については WebLogic Server でデシリアライゼーションが行われるので、クライアントサイド コードで使用できます。
注意 : | クライアントとサーバで異なるバージョンの WebLogic Server を使用する場合は、相互運用性の制限がある。「さまざまなバージョンの WebLogic Server クライアント/サーバ間におけるベンダ拡張機能のサポート」を参照してください。 |
JDBC ドライバで公開されている拡張機能メソッドを使用するには、アプリケーション コードに次のような手順を組み込む必要があります。
以降の節では、サンプル コードで詳細を示します。特定の JDBC ドライバの特定の拡張機能メソッドについては、JDBC ドライバ ベンダのドキュメントを参照してください。
以下のサンプル コードでは、Oracle Thin Driver で利用できる拡張機能メソッドを使用して、JDBC のベンダ拡張機能の使用方法を示します。使用する JDBC ドライバで公開されているメソッドに合わせて、これらの例を修正することができます。
データ ソースでの接続の作成に使用する JDBC ドライバから、インタフェースをインポートします。この例では Oracle Thin Driver のインタフェースを使用します。
import java.sql.*;
import javax.sql.DataSource;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import oracle.jdbc.*;
// ドライバ インタフェースをインポートする。ドライバは、データ ソースでデータベース接続を
// 作成するために使用するドライバと同じでなければならない
JNDI、DataSource、およびデータ ソース オブジェクトを使用して、データベース接続を確立します。詳細については、「JNDI ルックアップを使用して接続を取得する」を参照してください。
// データ ソース用の有効な DataSource オブジェクトを取得する
// ここでは、その詳細を getDataSource() が
// 処理すると仮定する
javax.sql.DataSource ds = getDataSource(args);
// DataSource から java.sql.Connection オブジェクトを取得する
java.sql.Connection conn = ds.getConnection();
接続を取得したら、ベンダの接続の形にキャストできます。この例では Oracle Thin Driver の OracleConnection インタフェースを使用します。
orConn = (oracle.jdbc.OracleConnection)conn;
// これは、weblogic.jdbc.vendor.oracle.OracleConnection へ接続をキャストする
// 次のような非推奨の処理に代わるものである
// orConn = (weblogic.jdbc.vendor.oracle.OracleConnection)conn;
次のコードでは、Oracle Thin Driver で使用できる Oracle の行プリフェッチ メソッドの使い方を示します。
// OracleConnection にキャストして、この接続の
// デフォルトの行プリフェッチ値を取得する
int default_prefetch =
((oracle.jdbc.OracleConnection)conn).getDefaultRowPrefetch();
// これは、weblogic.jdbc.vendor.oracle.OracleConnection へ接続をキャストする
// 次のような非推奨の処理に代わるものである
// ((weblogic.jdbc.vendor.oracle.OracleConnection)conn).
// getDefaultRowPrefetch();
System.out.println("Default row prefetch
is " + default_prefetch);
java.sql.Statement stmt = conn.createStatement();
// OracleStatement にキャストして、この文の
// 行プリフェッチ値を設定する
// このプリフェッチ値は、WebLogic Server とデータベースの
// 間の接続に適用されることに注意
((oracle.jdbc.OracleStatement)stmt).setRowPrefetch(20);
// これは、weblogic.jdbc.vendor.oracle.OracleStatement へ
// 文をキャストする次のような非推奨の処理に
// 代わるものである
// ((weblogic.jdbc.vendor.oracle.OracleStatement)stmt).
// setRowPrefetch(20);
// 通常の SQL クエリを実行して、その結果を処理 ...
String query = "select empno,ename from emp";
java.sql.ResultSet rs = stmt.executeQuery(query);
while(rs.next()) {
java.math.BigDecimal empno = rs.getBigDecimal(1);
String ename = rs.getString(2);
System.out.println(empno + "\t" + ename);
}
rs.close();
stmt.close();
conn.close();
conn = null;
}
Oracle が提供するほとんどの拡張機能では、「JDBC インタフェースのベンダ拡張機能の使い方」で説明したような標準的な方法を使用できます。ただし、Oracle Thin Driver では、以下のクラスの拡張機能メソッドに対するパブリック インタフェースを提供していません。
WebLogic Server では、これらのクラスの拡張機能メソッドにアクセスするために、独自のインタフェースを提供しています。
以降の節では、Oracle 拡張機能向けの WebLogic Server インタフェースを使用するためのサンプル コードを示します。サポートされるメソッドのリストについては、「Oracle 拡張機能インタフェースとサポートされるメソッドの表」を参照してください。詳細については、Oracle のドキュメントを参照してください。
注意 : | このプロセスを使用すると、「Oracle 拡張機能インタフェースとサポートされるメソッドの表」で示す Oracle 拡張機能向けの WebLogic Server インタフェースを使用できます。ただし、上記以外のインタフェースは非推奨になっており、WebLogic Server の今後のリリースで削除される予定です。 |
JDBC インタフェースに Oracle 拡張機能を使用する場合、次の制限があります。
以下のサンプル コードでは、パブリック インタフェースとして利用できない Oracle 拡張機能に対する WebLogic Server インタフェースにアクセスする方法を示します。次のようなインタフェースがあります。
WebLogic Server と共にサーバ サンプルをインストールするオプションを選択した場合は、JDBC サンプルの詳細なサンプル コードを参照してください。JDBC サンプルは通常、WL_HOME
\samples\server\src\examples\jdbc
にあります。WL_HOME
は WebLogic Server をインストールしたフォルダです。
WebLogic Server のサーバサイド アプリケーションでは、結果セット、または Java 配列として呼び出し可能ステートメントを使用することにより、Oracle Collection (SQL ARRAY) を実体化できます。
WebLogic Server アプリケーションで ARRAY を使用するには、次の手順に従います。
注意 : | ARRAY はサーバサイド アプリケーションでのみ使用できます。リモート クライアント アプリケーションでは ARRAY は使用できません。 |
この例で使用する Oracle インタフェースをインポートします。OracleArray インタフェースは、oracle.sql.ARRAY
に相当し、WebLogic Server でサポートされるメソッドを使用する場合、Oracle インタフェースと同様に使用できます。
import java.sql.*;
import javax.sql.DataSource;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import weblogic.jdbc.vendor.oracle.*;
JNDI と DataSource オブジェクトを使用して、データベース接続を確立します。詳細については、「JNDI ルックアップを使用して接続を取得する」を参照してください。
// 有効な DataSource オブジェクトを取得する
// ここでは、その詳細を getDataSource() が
// 処理すると仮定する
javax.sql.DataSource ds = getDataSource(args);
// DataSource から java.sql.Connection オブジェクトを取得する
java.sql.Connection conn = ds.getConnection();
呼び出し可能ステートメント、または結果セットに getArray()
メソッドを使用して、Java 配列を取得できます。この配列を java.sql.array
として使用することで標準 java.sql.array
メソッドを利用できます。また weblogic.jdbc.vendor.oracle.OracleArray
にキャストすることで、配列に Oracle 拡張機能メソッドを利用することもできます。
以下の例では、ARRAY を含む結果セットから java.sql.array
を取得する方法を示します。この例では、クエリにより、オブジェクト カラム (学生の成績を示す ARRAY) を含む結果セットが返されます。
try {
conn = getConnection(url);
stmt = conn.createStatement();
String sql = "select * from students";
//結果セットの取得
rs = stmt.executeQuery(sql);
while(rs.next()) {
BigDecimal id = rs.getBigDecimal("student_id");
String name = rs.getString("name");
log("ArraysDAO.getStudents() -- Id = "+id.toString()+", Student = "+name);
//結果セットからの配列の取得
Array scoreArray = rs.getArray("test_scores");
String[] scores = (String[])scoreArray.getArray();
for (int i = 0; i < scores.length; i++) {
log(" Test"+(i+1)+" = "+scores[i]);
}
}
データベースにおける ARRAY を更新するには、次の手順に従います。
java.sql.Array
または weblogic.jdbc.vendor.oracle.OracleArray
として扱います。setArray()
メソッドを使用して、データベース内の配列を更新します。次に例を示します。String sqlUpdate = "UPDATE SCOTT." + tableName + " SET col1 = ?";
conn = ds.getConnection();
pstmt = conn.prepareStatement(sqlUpdate);
pstmt.setArray(1, array);
pstmt.executeUpdate();
ARRAY に対して Oracle 拡張機能メソッドを利用するには、まずこの配列を weblogic.jdbc.vendor.oracle.OracleArray にキャストします。キャストが済むと ARRAY に対して Oracle 拡張メソッドを呼び出せます。次に例を示します。
oracle.sql.Datum[] oracleArray = null;
oracleArray = ((weblogic.jdbc.vendor.oracle.OracleArray)scoreArray).getOracleArray();
String sqltype = null
sqltype = oracleArray.getSQLTypeName()
WebLogic Server アプリケーションでは、Oracle データベースからオブジェクトにアクセスしたり、オブジェクトを操作したりできます。Oracle データベースからオブジェクトを検索したら、カスタム Java オブジェクト、または STRUCT (java.sql.struct
あるいは weblogic.jdbc.vendor.oracle.OracleStruct
) のいずれかとして、オブジェクトをキャストできます。STRUCT は、アプリケーション中のカスタム クラスを置き換える構造化データを表す型制限の緩いデータ型です。JDBC API における STRUCT インタフェースには、STRUCT 中の属性値を操作するためのさまざまなメソッドが組み込まれています。Oracle では、いくつかの追加メソッドを使用して、STRUCT インタフェースを拡張しています。WebLogic Server では、すべての標準メソッドと大部分の Oracle 拡張機能が実装されています。
注意 : | STRUCT を使用する場合、次の制限があります。 |
WebLogic Server アプリケーションで STRUCT を使用するには、次の手順に従います。
getObject
を使用して STRUCT を取得します。 java.sql.Struct
、標準のメソッドと Oracle 拡張機能メソッドを使用する場合は weblogic.jdbc.vendor.oracle.OracleStruct
) にキャストします。
データベース オブジェクトを STRUCT として取得するには、まずクエリを使用して結果セットを作成し、次に getObject
メソッドを使用して、結果セットから STRUCT を取得します。その後で STRUCT を java.sql.Struct
にキャストすることにより、標準 Java メソッドを使用できるようになります。次に例を示します。
conn = ds.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from people");
struct = (java.sql.Struct)(rs.getObject(2));
Object[] attrs = ((java.sql.Struct)struct).getAttributes();
WebLogic Server では、STRUCT に対応するすべての JDBC API メソッドがサポートされます。
Oracle では、標準メソッド以外に、Oracle 拡張機能メソッドもサポートしています。したがって、STRUCT を weblogic.jdbc.vendor.oracle.OracleStruct
にキャストすると、標準メソッドと拡張機能メソッドの両方を使用できるようになります。
STRUCT に Oracle 拡張機能メソッドを使用する場合、java.sql.Struct
(または元の getObject
の結果) を weblogic.jdbc.vendor.oracle.OracleStruct
にキャストする必要があります。次に例を示します。
java.sql.Struct struct =
(weblogic.jdbc.vendor.oracle.OracleStruct)(rs.getObject(2));
WebLogic Server では次の Oracle 拡張機能がサポートされます。
STRUCT の個々の属性値を取得するには、getAttributes()
および getAttributes(java.util.Dictionary map)
の標準 JDBC API メソッド、または Oracle 拡張機能メソッド getOracleAttributes()
を使用できます。
標準メソッドを使用するには、まず結果セットを作成し、この結果セットから STRUCT を取得した後で getAttributes()
メソッドを使用します。このメソッドにより、順序の付いた属性の配列が返されます。アプリケーションのオブジェクト (Java 言語タイプなど) に STRUCT (データベースのオブジェクト) の属性を割り当てることができます。この後、属性を個別に操作できるようになります。次に例を示します。
conn = ds.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from people");
//第 3 カラムはオブジェクト データ型を使用
//getObject() により、値の配列にオブジェクトを割り当てる
struct = (java.sql.Struct)(rs.getObject(2));
Object[] attrs = ((java.sql.Struct)struct).getAttributes();
String address = attrs[1];
上の例で、people
テーブルの第 3 カラムではオブジェクト データ型を使用しています。この例では、値の配列を含む Java オブジェクトに getObject
メソッドの結果を割り当て、必要に応じて配列中の個別の値を使用する方法を示しています。
また、getAttributes(java.util.Dictionary map)
メソッドを使用しても、STRUCT から属性を取得できます。このメソッドを使用する場合は、Java 言語データ型に Oracle オブジェクトのデータ型をマップするためのハッシュ テーブルを用意する必要があります。次に例を示します。
java.util.Hashtable map = new java.util.Hashtable();
map.put("NUMBER", Class.forName("java.lang.Integer"));
map.put("VARCHAR", Class.forName("java.lang.String"));
Object[] attrs = ((java.sql.Struct)struct).getAttributes(map);
String address = attrs[1];
また、Oracle 拡張機能メソッド getOracleAttributes()
を使用して、STRUCT の属性を取得することもできます。まず、STRUCT を weblogic.jdbc.vendor.oracle.OracleStruct
にキャストする必要があります。このメソッドにより、oracle.sql.Datum
オブジェクトのデータ配列が返されます。次に例を示します。
oracle.sql.Datum[] attrs =
((weblogic.jdbc.vendor.oracle.OracleStruct)struct).getOracleAttributes();
oracle.sql.STRUCT address = (oracle.sql.STRUCT) attrs[1];
Object address_attrs[] = address.getAttributes();
上の例では、STRUCT がネスト構造になっています。つまり、ここで返されるデータ配列には、別の STRUCT が入れ子の構造で組み込まれています。
STRUCT を使用してデータベースのオブジェクトを更新するには、プリペアド ステートメントにある setObject
メソッドを使用します。次に例を示します。
conn = ds.getConnection();
stmt = conn.createStatement();
ps = conn.prepareStatement ("UPDATE SCHEMA.people SET EMPLNAME = ?,
EMPID = ? where EMPID = 101");
ps.setString (1, "Smith");
ps.setObject (2, struct);
ps.executeUpdate();
WebLogic Server では、setObject
メソッドの 3 つのバージョンがすべてサポートされます。
STRUCT は通常 Java アプリケーション中で、データベース オブジェクトにマップするカスタム Java クラスの代わりに、データベース オブジェクトを実体化する場合に使用します。WebLogic Server アプリケーションでは、データベースに転送する STRUCT は作成できません。一方で、アプリケーションから検索や操作が実行できるようなデータベース オブジェクトを作成する文は使用できます。次に例を示します。
conn = ds.getConnection();
stmt = conn.createStatement();
cmd = "create type ob as object (ob1 int, ob2 int)"
stmt.execute(cmd);
cmd = "create table t1 of type ob";
stmt.execute(cmd);
cmd = "insert into t1 values (5, 5)"
stmt.execute(cmd);
注意 : | アプリケーションで STRUCT は作成できません。データベースから既存のオブジェクトを検索して、これを STRUCT にキャストすることはできます。アプリケーションで STRUCT オブジェクトを作成するには、標準外の Oracle STRUCT 記述子オブジェクトを使用します。ただし、WebLogic Server ではサポートされません。 |
STRUCT を使用する WebLogic Server アプリケーションのパフォーマンスを向上させるために、setAutoBuffering(boolean)
メソッドで自動バッファリング機能を切り換えることができます。自動バッファリングを true
に設定すると、weblogic.jdbc.vendor.oracle.OracleStruct
オブジェクトに、STRUCT オブジェクトにあるすべての属性のローカル コピーが変換済みのフォーム (すなわち SQL から Java 言語オブジェクトに実体化した形式) で保持されます。アプリケーションが、STRUCT に再びアクセスした時点で、データを再度変換する必要はありません。
注意 : | 変換した属性をバッファリングすると、アプリケーションで使用するメモリ量が過度に増大することがあります。自動バッファリングの有効/無効を切り換えるときは、可能メモリ使用量についても考慮してください。 |
以下の例は、自動バッファリングをアクティブにする方法を示します。
((weblogic.jdbc.vendor.oracle.OracleStruct)struct).setAutoBuffering(true);
また、getAutoBuffering()
メソッドを使用して、自動バッファリング モードを判断することもできます。
REF は、行オブジェクトに対する論理ポインタです。REF を検索すると、実際には別のテーブルにある値を指すポインタが返されます。REF のターゲットは、オブジェクト テーブルの行でなければなりません。REF を使用して、これが参照するオブジェクトを検証したり、更新したりできます。また REF を変更することにより、同じオブジェクト タイプの別のオブジェクトを指示したり、null 値を割り当てたりすることができます。
注意 : | REF を使用する場合、次の制限があります。 |
WebLogic Server アプリケーションで REF を使用するには、次の手順に従います。
また、データベースで REF 作成したり、更新したりできます。
アプリケーションで REF を取得するには、まずクエリを使用して結果セットを作成し、次に getRef
メソッドを使用して、結果セットから REF を取得します。続いて REF を java.sql.Ref
にキャストすることにより、組み込み Java メソッドを使用できます。次に例を示します。
conn = ds.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT ref (s) FROM t1 s where s.ob1=5");
rs.next();
// java.sql.Ref にキャストし、REF を取得
ref = (java.sql.Ref) rs.getRef(1);
なお、上の例の WHERE 句では、ドット表記法を使用して、参照するオブジェクトの属性を指定しています。
REF を java.sql.Ref
にキャストした後は、Java API メソッド getBaseTypeName
を使用できます (これは REF に対応した唯一の JDBC 2.0 標準メソッドです)。
REF を取得すると、実際には別のオブジェクト テーブルにある値を指すポインタが返されます。REF 値の取得や操作を行うには、Oracle 拡張機能を使用します。この拡張機能は、sql.java.Ref
を weblogic.jdbc.vendor.oracle.OracleRef にキャストする場合に限り使用できます。
REF に Oracle 拡張機能メソッドを使用するには、REF を Oracle REF にキャストします。次に例を示します。
oracle.sql.StructDescriptor desc = ((weblogic.jdbc.vendor.oracle.OracleRef)ref).getDescriptor();
WebLogic Server では次の Oracle 拡張機能がサポートされます。
Oracle では、2 つのバージョンの getValue()
メソッドが提供されています。パラメータを取らないメソッドと、戻り値の型をマップするハッシュ テーブルを必要とするメソッドの 2 種類です。いずれかの getValue()
メソッドを使用して REF の属性値を取得すると、STRUCT または Java オブジェクトのいずれかの形式で結果が返されます。
パラメータを取らない getValue()
メソッドを使用する方法を以下の例で示します。この例では、REF が oracle.sql.STRUCT 型にキャストされます。getAttributes()
メソッドの説明で示したとおり、STRUCT メソッド群を使用して値を操作できます。
oracle.sql.STRUCT student1 =
(oracle.sql.STRUCT)((weblogic.jdbc.vendor.oracle.OracleRef)ref).getValue ();
Object attributes[] = student1.getAttributes();
また、getValue(dictionary)
メソッドを使用して、REF の値を取得できます。また REF の属性ごとにデータ型を Java 言語データ型にマップするためのハッシュ テーブルを用意する必要があります。次に例を示します。
java.util.Hashtable map = new java.util.Hashtable();
map.put("VARCHAR", Class.forName("java.lang.String"));
map.put("NUMBER", Class.forName("java.lang.Integer"));
oracle.sql.STRUCT result = (oracle.sql.STRUCT)
((weblogic.jdbc.vendor.oracle.OracleRef)ref).getValue (map);
setValue(object)
メソッドを使用して REF 値を更新する場合は、REF の新しい値を持つオブジェクトを作成してから、そのオブジェクトを setValue
メソッドのパラメータとして渡します。次に例を示します。
STUDENT s1 = new STUDENT();
s1.setName("Terry Green");
s1.setAge(20);
((weblogic.jdbc.vendor.oracle.OracleRef)ref).setValue(s1);
REF の値を setValue(object)
メソッドで更新すると、実際には REF が示すテーブルの値が更新されます。
プリペアド ステートメントを使用して REF が指示する位置を更新するには、次の基本手順に従います。
try {
conn = ds.getConnection();
stmt = conn.createStatement();
//REF を取得する
rs = stmt.executeQuery("SELECT ref (s) FROM t1 s where s.ob1=5");
rs.next();
ref = (java.sql.Ref) rs.getRef(1); //REF を java.sql.Ref にキャストする
}
//プリペアド ステートメントの作成と実行
String sqlUpdate = "update t3 s2 set col = ? where s2.col.ob1=20";
pstmt = conn.prepareStatement(sqlUpdate);
pstmt.setRef(1, ref);
pstmt.executeUpdate();
呼び出し可能ステートメントを使用して、REF が指示する位置を更新する場合は、まずストアド プロシージャを作成し、いずれかの IN パラメータを設定して、OUT パラメータを登録した後、文を実行します。ストアド プロシージャでは、実際の位置を指示する REF 値が更新されます。次に例を示します。
conn = ds.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT ref (s) FROM t1 s where s.ob1=5");
rs.next();
ref1 = (java.sql.Ref) rs.getRef(1);
// ストアド プロシージャを準備する
sql = "{call SP1 (?, ?)}";
cstmt = conn.prepareCall(sql);
// IN パラメータの設定と OUT パラメータの登録
cstmt.setRef(1, ref1);
cstmt.registerOutParameter(2, getRefType(), "USER.OB");
// 実行
cstmt.execute();
JDBC アプリケーションに REF オブジェクトは作成できません。単に、データベースから既存の REF オブジェクトが検索されるだけです。ただし、文またはプリペアド ステートメントを使用して、データベースに REF を作成できます。次に例を示します。
conn = ds.getConnection();
stmt = conn.createStatement();
cmd = "create type ob as object (ob1 int, ob2 int)"
stmt.execute(cmd);
cmd = "create table t1 of type ob";
stmt.execute(cmd);
cmd = "insert into t1 values (5, 5)"
stmt.execute(cmd);
cmd = "create table t2 (col ref ob)";
stmt.execute(cmd);
cmd = "insert into t2 select ref(p) from t1 where p.ob1=5";
stmt.execute(cmd);
上の例では、オブジェクト型 (ob
)、このオブジェクト型のテーブル (t1
)、ob
オブジェクトのインスタンスを示す REF カラムのあるテーブル (t2
) が作成され、REF が REF カラムに挿入されます。REF は、t1
の行を指します (最初のカラムの値は 5
)。
この節では、OracleBlob インタフェースへのアクセス方法を示すサンプル コードについて説明します。WebLogic Server でサポートされるメソッドを使用している場合、この例で示す構文は、OracleBlob インタフェースで使用できます。「Oracle 拡張機能インタフェースとサポートされるメソッドの表」を参照してください。
注意 : | BLOB および CLOB (「LOB」と呼ばれる) を使用する場合、トランザクションの境界を考慮する必要があります。たとえば、すべての読み取り/書き込みをトランザクション内の特定の LOB に転送します。詳細については、Oracle Web サイトにある Oracle のマニュアルの「LOB Locators and Transaction Boundaries」を参照してください。 |
BLOB ロケータまたはハンドルは、Oracle Thin Driver Blob への参照です。
String selectBlob = "select blobCol from myTable where blobKey = 666"
次のコードでは、Connection がすでに確立されていることを前提としています。
ResultSet rs = null;
Statement myStatement = null;
java.sql.Blob myRegularBlob = null;
java.io.OutputStream os = null;
この try/catch ブロックでは、BLOB ロケータを取得して、Oracle Blob 拡張機能にアクセスします。
try {
// BLOB ロケータを取得する
myStatement = myConnect.createStatement();
rs = myStatement.executeQuery(selectBlob);
while (rs.next()) {
myRegularBlob = rs.getBlob("blobCol");
}
// 記述用の基底の Oracle 拡張機能にアクセス
// する。OracleThinBlob インタフェースにキャストして
// Oracle メソッドにアクセスする
os = ((OracleThinBlob)myRegularBlob).getBinaryOutputStream();
...
} catch (SQLException sqe) {
System.out.println("ERROR(general SQE): " +
sqe.getMessage());
}
Oracle.ThinBlob
インタフェースにキャストしたら、Oracle がサポートするメソッドにアクセスできます。
プリペアド ステートメントを使用して CLOB を更新し、新しい値が以前の値より短い場合、CLOB には更新中に明示的に置換されなかった文字が保持されます。たとえば、CLOB の現在の値が abcdefghij
の場合に、プリペアド ステートメントを使用して zxyw
で CLOB を更新すると、CLOB の値は zxywefghij
になります。プリペアド ステートメントで更新された値を修正するには、dbms_lob.trim
プロシージャを使用して、更新後に残った余分な文字を削除します。dbms_lob.trim
プロシージャの詳細については、Oracle のドキュメントを参照してください。
Oracle 仮想プライベート データベース (Oracle Virtual Private Database: VPD) は、サーバによって強制されるアプリケーション定義のファイン グレイン アクセス制御と、Oracle 9i データベース サーバのセキュアなアプリケーション コンテキストを組み合わせたものです。WebLogic Server アプリケーションで VPD を使用するには、以下の手順に従います。
注意 : | XA 対応の JDBC ドライバを使用している場合は、KeepXAConnTillTxComplete=true に設定する必要があります。Administration Console オンライン ヘルプの「JDBC データ ソース : コンフィグレーション : 接続プール」を参照してください。 |
import weblogic.jdbc.extensions.WLConnection
// WLS JDBC データ ソースから接続を取得する
Connection conn = ds.getConnection();
// 基底のベンダ接続オブジェクトを取得する
oracle.jdbc.OracleConnection orConn = (oracle.jdbc.OracleConnection)
(((WLConnection)conn).getVendorConnection());
// CLIENT_IDENTIFIER を設定する (これはデータベース サーバ サイドの
// USERENV ネーミング コンテキストからアクセス可能になる)
orConn.setClientIdentifier(clientId);
/* アプリケーション固有の処理を実行する (できれば orConn ではなく conn を使用する) */
// 接続を WLS JDBC データ ソースに戻す前にクリーンアップする
orConn.clearClientIdentifier(clientId);
// ベンダ固有の呼び出しが完了したら、
// すぐに物理的な接続への参照を破棄する
orConn = null;
// プールされた接続を閉じる
conn.close();
注意 : | このコードでは、プールされた (論理的な) 接続から得た基底の物理的な接続を使用します。使用方法のガイドラインについては、「データ ソースからの物理的な接続の取得」を参照してください。 |
WebLogic Server では、oracle.jdbc.OracleConnection
.setClientIdentitfier
メソッドと oracle.jdbc.OracleConnection
.clearClientIndentifier
メソッドがサポートされています。これらを使用すると、プールされた接続から基底の物理的接続を使用せずに済みます。WebLogic Server アプリケーションで VPD を使用するには、以下の手順に従います。
import weblogic.jdbc.vendor.oracle.OracleConnection;
// WLS JDBC データ ソースから接続を取得する
Connection conn = ds.getConnection();
// Oracle 拡張機能にキャストして CLIENT_IDENTIFIER を設定する
// (これはデータベース サーバ サイドの USERENV
// ネーミング コンテキストからアクセス可能になる)
((weblogic.jdbc.vendor.oracle.OracleConnection)conn).setClientIdentifier(clientId);
/* アプリケーション固有の処理を実行する */
// 接続を WLS JDBC データ ソースに戻す前にクリーン アップする
((OracleConnection)conn).clearClientIdentifier(clientId);
// 接続を閉じる
conn.close();
WebLogic Server でのベンダの JDBC 拡張機能のサポート方法は WebLogic Server 8.1 で変更されました。その影響で、さまざまなバージョンのクライアント/サーバ間の相互運用性が変更されています。
WebLogic Server 8.1 以降のクライアントが WebLogic Server 7.0 以前のサーバと対話する場合、Oracle 拡張機能はサポートされません。クライアント アプリケーションで JDBC オブジェクトを Oracle 拡張機能インタフェースにキャストしようとすると、ClassCastException
を受け取ります。ただし、WebLogic Server 7.0 以前のクライアントが WebLogic Server 8.1 以降のサーバと対話する場合、Oracle 拡張機能はサポートされます。
これは、以下の Oracle 拡張機能インタフェースに対して適用されます。
weblogic.jdbc.vendor.oracle.OracleConnection
weblogic.jdbc.vendor.oracle.OracleStatement
weblogic.jdbc.vendor.oracle.OraclePreparedStatement
weblogic.jdbc.vendor.oracle.OracleCallableStatement
weblogic.jdbc.vendor.oracle.OracleResultSet
weblogic.jdbc.vendor.oracle.OracleThinBlob
weblogic.jdbc.vendor.oracle.OracleThinClob
weblogic.jdbc.vendor.oracle.OracleArray
weblogic.jdbc.vendor.oracle.OracleRef
weblogic.jdbc.vendor.oracle.OracleStruct
注意 : | 標準の JDBC インタフェースは、クライアントまたはサーバのバージョンに関係なくサポートされます。 |
以前のリリースの WebLogic Server では、以下の表に示す JDBC 拡張機能のみがサポートされていました。現在のリリースの WebLogic Server は、ベンダの JDBC ドライバでパブリック インタフェースとして公開されているほとんどの拡張機能メソッドをサポートします。ベンダ拡張機能を使用する手順については、「JDBC インタフェースのベンダ拡張機能の使い方」を参照してください。ベンダ拡張機能をサポートするための新しい内部メカニズムは以前の実装に依存していないため、一部のインタフェースは不要になって非推奨となりました。これらのインタフェースは WebLogic Server の今後のリリースで削除される予定です。表 5-1 を参照してください。表に示された代わりのインタフェースを使用することをお勧めします。
表 5-2 に示すインタフェースは、これらの拡張機能メソッドにアクセスするインタフェースが Oracle では提供されていないため、引き続き有効です。
Oracle インタフェースを以下の表に示します。また、標準 JDBC (java.sql.*
) インタフェースを拡張するために Oracle Thin Driver (またはこれらのメソッドをサポートする他のドライバ) で使用するメソッドのうち、サポートされているものについても示します。
![]() ![]() ![]() |