WebLogic JDBC プログラマーズ ガイド
![]() |
![]() |
![]() |
![]() |
以下の節では、サードパーティ JDBC ドライバの設定および使用方法について説明します。
WebLogic Server は、以下の機能を提供するサードパーティ JDBC ドライバと連携して動作します。
詳細については、『WebLogic Platform 8.1 でサポート対象のコンフィグレーション』の「サポート対象のデータベース コンフィグレーション」を参照してください。
以下の節では、WebLogic サーバとサードパーティ JDBC ドライバの設定および使用方法について説明します。
次のサードパーティ ドライバは、WebLogic サーバと共にインストールされます:
注意 : 次のリリースでは、JDBC ドライバのサポート対象が変更されました。
Weblogic サーバでインストールされたドライバは、weblogic.jar
と共に WL_HOME\server\lib
フォルダ (WL_HOME は WebLogic Platform がインストールされたフォルダ) に保存されます。weblogic.jar
のマニフェストには、これらのファイルがリストされており、weblogic.jar
のロード時 (サーバの起動時) にロードできます。したがって、CLASSPATH
にこれらの JDBC ドライバを追加する必要はありません。
WebLogic Server でインストールされていないサードパーティ JDBC ドライバを使用する場合、JDBC ドライバ クラスの場所を追加するには、WebLogic サーバのクラスパスを更新する必要があります。WL_HOME
/common/bin
で commEnv.cmd/sh
スクリプトを編集し、『WebLogic Server コマンド リファレンス』の「クラスパスの変更」の説明に従ってクラスを付加します。
次の節には、Oracle Thin Driver の使い方に関する情報が含まれています。
別のバージョンのドライバを使用する場合は、WL_HOME
\server\lib
の ojdbc14.jar
ファイルを Oracle のファイルの更新されたバージョンで置き換えるか、CLASSPATH
の先頭に新しいファイルを追加する必要があります。ドライバのアップデートは、次の Oracle Web サイトからダウンロードできます。http://otn.oracle.com/software/content.html
注意 : Oracle Thin Driver クラスのソースとして、classes12.zip
が ojdbc14.jar
に置き換えられました。このバージョンのドライバは Java 2 SDK バージョン 1.4 で使用します。
WebLogic Server の WL_HOME
\server\ext\jdbc\oracle
インストール フォルダ (WL_HOME
は WebLogic Platform がインストールされるフォルダ) には、Oracle Thin Driver のバージョン 9.2.0 および 10g のサブフォルダがあります。
9.2.0 バージョンのドライバを使用するには、次の手順に従います。
バージョン 10g (デフォルト) に戻す場合も、上記の手順に従います。ただし、バージョンのコピーは次のフォルダで行います。WL_HOME
\server\ext\jdbc\oracle\10g
Oracle 8.x 以前のバージョンでは、Oracle Thin Driver を含むパッケージは oracle.jdbc.driver
でした。Oracle Thin Driver バージョン 8.1.7 を使用する JDBC 接続プールをコンフィグレーションする場合、DriverName ([ドライバ クラス名]) は oracle.jdbc.driver.OracleDriver
と指定します。Oracle 9.x および 10g では、Oracle Thin Driver を含むパッケージは oracle.jdbc
です。Oracle Thin Driver バージョン 9.x または 10g を使用する JDBC 接続プールをコンフィグレーションする場合、DriverName ([ドライバ クラス名]) は oracle.jdbc.OracleDriver
と指定します。バージョン 9.x または 10g のドライバで oracle.jdbc.driver.OracleDriver
クラスを使用することもできますが、Oracle はこのクラスに対して将来的な機能拡張を行わない可能性があります。
Oracle Thin Driver の詳細については、Oracle のマニュアルを参照してください。
注意 : パッケージの変更は、Oracle Thin Driver の XA バージョンには適用されません。Oracle Thin Driver の XA バージョンの場合は、JDBC 接続プールの DriverName ([ドライバ クラス名]) として oracle.jdbc.xa.client.OracleXADataSource
を使用します。
Oracle Thin Driver には、Oracle のオブジェクト型またはコレクション型の一部として取得または挿入されない、すべての CHAR および NCHAR データ型の Oracle 文字セットに対するグローバリゼーション サポートが含まれています。
ただし、Oracle オブジェクトまたはコレクションの CHAR および VARCHAR データの部分に関しては、Oracle Thin Driver には以下の文字セットのグローバリゼーション サポートのみ含まれています。
Oracle のオブジェクト型またはコレクションの中の CHAR および NCHAR データで他の文字セットを使用する場合は、CLASSPATH
に nls_charset.zip
を含める必要があります。このファイルが CLASSPATH
に入ってないと、次の例外が発生します。
java.sql.SQLException: Non supported character set: oracle-character-set-178
nls_charset12.zip
ファイルは WebLogic Server と共に WL_HOME
\server\ext\jdbc\oracle\920
および WL_HOME
\server\ext\jdbc\oracle\10g
フォルダにインストールされます (WL_HOME
は WebLogic Server のインストール先フォルダです)。CLASSPATH
の設定手順については、「 WebLogic Server でインストールされていないサードパーティ JDBC ドライバの使い方」を参照してください。
注意 : バージョン 10g のドライバのグローバリゼーション サポートとして、Oracle では nls_charset.zip
に代わる orai18n.jar
ファイルを提供しています。Oracle のオブジェクト型およびコレクションにおいて CHAR および NCHAR 型のデータに、US7ASCII、WE8DEC、WE8ISO8859P1、および UTF8 以外の文字セットを使用している場合には、CLASSPATH
に orai18n.jar
を含める必要があります。orai18n.jar
は WebLogic Server と共にインストールされません。このファイルは Oracle の Web サイトからダウンロードできます。
The WL_HOME
\server\ext\jdbc\oracle\
(WL_HOME
フォルダは webLogic サーバインストールされているフォルダ) には、Oracle Thin driver の 9.2.0 および 10g バージョンのサブフォルダがあります。各サブフォルダには、デバッグとトレースの使用をサポートするために必要なクラスを含む、ojdbc14_g.jar
ファイルが含まれています。
Oracle Thin Driver をデバッグ モードで使用するには、次の手順に従います。
ojdbc14_g.jar
ファイルのパスを WebLogic Server クラスパスに『WebLogic Server コマンド リファレンス』の「クラスパスの変更」で説明されている手順に従って追加します。
WebLogic Server に付属する Sybase jConnect 4.5 (jConnect.jar)、5.5 (jconn2.jar)、および 6.0 (jconn3.jar) は事前にコンフィグレーションされ、そのまま使用できる状態になっています。これ以降のバージョンを使用する場合は、WL_HOME\server\lib
にある Sybase.jar
ファイルを DBMS ベンダが提供する最新バージョンのファイルに置き換えます。
WebLogic Server でインストールされたバージョンに戻す場合は、WL_HOME\server\lib
フォルダに次のファイルをコピーします。
\server\ext\jdbc\sybase\jConnect.jar
\server\ext\jdbc\sybase\jConnect-5_5\classes\jconn2.jar
\server\ext\jdbc\sybase\jConnect-6_0\classes\
jconn3.jar
IBM DB2 クライアントのインストールには、接続プールで DB2 データベースへの接続を作成できる Type 2 JDBC ドライバが含まれています。デフォルトでは、DB2 クライアントはドライバの JDBC 1.x バージョンを使用します。JDBC 2.0 に準拠したバージョンを使用するには、次の手順に従います。
注意 : DB2 クライアントは、データベースへの接続に DB2 Type 2 JDBC ドライバを使用するマシンごとにインストールする必要があります。すべての Type 2 ドライバと同様、DB2 ドライバはデータベースへアクセスするためにデータベース クライアント内のライブラリに依存しています。
接続プールで DB2 Type 2 JDBC ドライバを使用する前に、ドライバ クラスを CLASSPATH に、DB2 クライアント ライブラリを PATH に追加する必要があります。ドメインの起動スクリプトでこれを行うことができます。次に例を示します。
set CLASSPATH=db2_install_path
\java\db2java.zip;%CLASSPATH%
set PATH=db2_install_path
\bin;%PATH%
db2_install_path
は DB2 クライアントをインストールしたディレクトリです。
IBM DB2 ドライバの XA バージョンを使用する場合は、『WebLogic JTA プログラマーズ ガイド』の「IBM DB2 Type 2 XA JDBC Driver の使い方」でコンフィグレーション手順を参照してください。
DB2 Type 2 ドライバを使用する接続を含む接続プールを作成するには、Administration Console の JDBC 接続プール アシスタントを使用するか (Administration Console オンライン ヘルプの「JDBC 接続プール」を参照)、または JMX API を使用します (「接続プールの動的作成」を参照)。
IBM DB2 Type 2 JDBC Driver を使用する接続プールを作成するときは、表 5-1 および 表 5-2 に示す属性を使用します。
[URL] と [プロパティ] の文字列にあるデータベース名は、DB2 クライアントで使用するためにコンフィグレーションされたデータベース (DB2 のクライアント構成アシスタントに表示されるデータベースなど) でなければなりません。また、データベース ユーザは、[テスト テーブル名] に指定したテーブルで SELECT を実行できる必要があります。
config.xml
ファイルのエントリは、次のようになります。
<JDBCConnectionPool DriverName="COM.ibm.db2.jdbc.app.DB2Driver"
Name="MyJDBC Connection Pool"
Password="{3DES}Pd8QwSJ5FtLEfuiA/vcy3g=="
Properties="user=dbuser;DatabaseName=db1"
Targets="myserver"
TestConnectionsOnCreate="true"
TestConnectionsOnReserve="true"
TestTableName="SYSIBM.SYSTABLES"
URL="jdbc:db2:db1"/>
[URL] と [プロパティ] の文字列にあるデータベース名は、DB2 クライアントで使用するためにコンフィグレーションされたデータベース (DB2 のクライアント構成アシスタントに表示されるデータベースなど) でなければなりません。
DB2 では、グローバル トランザクションのすべての処理が単一のデータベース接続で発生する必要があるため、[トランザクション完了まで XA 接続を保持] (KeepXAConnTillTxComplete) を true に設定する必要があります。
config.xml
ファイルのエントリは、次のようになります。
<JDBCConnectionPool DriverName="COM.ibm.db2.jdbc.DB2XADataSource"
KeepXAConnTillTxComplete="true"
Name="My XA JDBC Connection Pool"
Password="{3DES}Pd8QwSJ5FtLEfuiA/vcy3g=="
Properties="user=dbuser;DatabaseName=db1"
Targets="myserver"
TestConnectionsOnCreate="true"
TestConnectionsOnReserve="true"
TestTableName="SYSIBM.SYSTABLES"
URL="jdbc:db2:db1"/>
Microsoft SQL Server 2000 Driver for JDBC は、ライセンスを持つ SQL Server 2000 ユーザならば無料でダウンロードできます。このドライバは、JDBC 2.0 オプション パッケージのサブセットをサポートする Type 4 JDBC ドライバです。Microsoft SQL Server 2000 Driver for JDBC のインストール時に、サポート ドキュメントをオプションでインストールできます。ドライバに関する包括的な情報については、そのドキュメントを参照する必要があります。また、確認済みの問題については、「リリース マニフェスト」を参照してください。
以降の節では、Microsoft SQL Server 2000 Driver for JDBC をインストールおよびコンフィグレーションする方法について説明します。
Microsoft SQL Server 2000 Driver for JDBC を Windows サーバにインストールするには、次の手順に従います。
setup.exe
ファイル) をダウンロードします。そのファイルをローカル コンピュータ上の一時ディレクトリに保存します。Microsoft SQL Server 2000 Driver for JDBC を UNIX サーバにインストールするには、次の手順に従います。
mssqlserver.tar
ファイル) をダウンロードします。そのファイルをローカル コンピュータ上の一時ディレクトリに保存します。
tar -xvf mssqlserver.tar
install.ksh
Microsoft SQL Server Driver for JDBC を使用する接続プールを作成するときは、表 5-3 の属性を使用します。
<JDBCConnectionPool
Name="mssqlPool"
DriverName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
URL="jdbc:microsoft:sqlserver://db4:1433"
Properties="databasename=db4;user=sa;
selectMethod=cursor"
Password="{3DES}vlsUYhxlJ/I="
InitialCapacity="4"
CapacityIncrement="2"
MaxCapacity="10"
Targets="examplesServer"
/>
注意 : 接続をトランザクション モードで使用するには、接続プロパティのリストに selectMethod=cursor
を追加する必要があります。このように設定することで、アプリケーションで特定の接続から同時に複数の文を開くことが可能となります。
selectMethod=cursor
を設定しない場合は、同時に開いた文ごとに、接続の内部的なクローンが別々の DBMS ユーザとして作成されます。この場合、トランザクションを同時にコミットできなくなるため、デッドロックが発生するおそれがあります。
WebLogic Server と Informix データベースを使用する場合は、IBM Informix JDBC Driver を使用することをお勧めします。このドライバは、次の IBM Web サイトからダウンロードできます (http://www-3.ibm.com/software/data/informix/tools/jdbc/)。IBM Informix JDBC Driver は無償で提供されていますが、サポートの対象にはなりません。製品をダウンロードするには、IBM への登録が必要になることがあります。JDBC/EMBEDDED SQLJ セッションでドライバをダウンロードし、ダウンロードした zip ファイルに添付された install.txt
ファイルの指示に従って、ドライバをインストールします。
ドライバをダウンロードしてインストールした後、以下の手順に従って、WebLogic Server でドライバを使用できるように準備します。
INFORMIX_INSTALL
\lib
から ifxjdbc.jar
ファイルおよび ifxjdbcx.jar
ファイルをコピーして、WL_HOME
\server\lib
フォルダに貼り付けます。ここで、 INFORMIX_INSTALL
は、Informix JDBC ドライバをインストールしたルート ディレクトリです。
また WL_HOME
は、WebLogic Platform をインストールしたフォルダ (通常は c:\bea\weblogic81
) です。
set CLASSPATH=%WL_HOME%\server\lib\ifxjdbc.jar
;%WL_HOME%\server\lib\ifxjdbcx.jar
;%CLASSPATH%
IBM Informix JDBC driver を使用する接続プールを作成するときは、表 5-4 および 表 5-5 に示す属性を使用します。
config.xml
ファイルのエントリは、次のようになります。
<JDBCConnectionPool
DriverName="com.informix.jdbc.IfxDriver"
InitialCapacity="3"
LoginDelaySeconds="1"
MaxCapacity="10"
Name="ifxPool"
Password="xxxxxxx"
Properties="informixserver=ifxserver;user=informix"
Targets="examplesServer"
URL="jdbc:informix-sqli:ifxserver:1543"
/>
注意 : [プロパティ] の文字列の portNumber
と =
の間にはスペースが入っています。
config.xml
ファイルのエントリは、次のようになります。
<JDBCConnectionPool CapacityIncrement="2"
DriverName="com.informix.jdbcx.IfxXADataSource"
InitialCapacity="2" MaxCapacity="10"
Name="informixXAPool"
Properties="user=informix;url=jdbc:informix-sqli:
//111.11.11.11:1543/db1:informixserver=lcsol15;
password=informix;portNumber =1543;databaseName=db1;
serverName=dbserver1;ifxIFXHOST=111.11.11.11"
SupportsLocalTransaction="true" Targets="examplesServer"
TestConnectionsOnReserve="true" TestTableName="emp"/>
注意 : Administration Console を使用して接続プールを作成する場合、接続プールを対象のサーバに適切にデプロイするためには、その前にサーバを停止して再起動する必要があります。この問題は確認済みです。
IBM Informix JDBC Driver を使用するときは、次の制限について注意が必要です。
IFX_USEPUT
環境変数が 1
に設定されていない限り、TEXT または BYTE カラムのある行を挿入しようとすると、バッチ更新は失敗します。
Oracle Thin Driver などのサードパーティ Type 4 ドライバを使用してデータベース接続を取得する方法について以下の節で説明します。接続を確立するには、接続プール、データ ソース、および JNDI ルックアップを使用することをお勧めします。
まず、Administration Console を使用して接続プールとデータ ソースを作成し、次に JNDI ルックアップを使用して接続を確立します。
JDBC 接続プールと JDBC DataSource の作成手順については、「接続プールのコンフィグレーションと使い方」および「DataSource のコンフィグレーションと使い方」を参照してください。
JNDI を使用してサードパーティ ドライバにアクセスするには、まずサーバの URL を指定して JNDI ツリーから 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
は WebLogic Server が接続リクエストをリスンするポートの番号です。)
この例では、Hashtable オブジェクトを使って、JNDI ルックアップに必要なパラメータを渡しています。JNDI ルックアップを実行する方法は他にもあります。詳細については、『WebLogic JNDI プログラマーズ ガイド』を参照してください。
ルックアップの失敗を捕捉するために JNDI ルックアップが try/catch
ブロックで包まれている点に注意してください。また、コンテキストが finally
ブロックの中で閉じられている点にも注意してください。
注意 : やむを得ない場合を除き、物理的な JDBC 接続に直接アクセスすることはお勧めしません。「物理的な接続の使用に関する制限」を参照してください。
通常は、WebLogic Server で提供されている汎用的な JDBC 接続 (ラップされた物理的な接続) に接続をキャストします。この方法の場合、サーバ インスタンスは、接続プールの接続の管理、接続プール機能の有効化、およびアプリケーションに提供される接続の品質の維持を行うことができます。場合によっては、DBMS ベンダが、物理的な接続 (実際のベンダ JDBC 接続) への直接アクセスを必要とする、非標準の JDBC 関連クラスを提供していることがあります。接続プールの物理的な接続に直接アクセスするには、getVendorConnection を使用して接続をキャストする必要があります。
物理的なデータベース接続を取得するには、最初に「JNDI を使用して接続を取得する」の説明に従って接続プールから接続を取得してから、次のいずれかを実行します。
getVendorConnection
を使用)WLConnection
としてキャストし、getVendorConnection
を呼び出す物理的なデータベース接続への直接アクセスは、ベンダ固有の呼び出しに限定するようにしてください。それ以外の場合は、WebLogic Server で提供されている汎用的な JDBC 接続を使用します。ベンダ固有の呼び出しに対して接続を開くサンプル コードをコード リスト 5-1 に示します。
コード リスト 5-1ベンダ固有の呼び出しに対する接続を開くためのサンプル コード
//この追加クラスと、必要なベンダのパッケージを
//インポートする
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 接続プール] --> [コンフィグレーション] --> [接続]」を参照してください。ベンダ固有の呼び出しに対して接続を閉じるサンプル コードをコード リスト 5-2 に示します。
注意 : [影響のある接続の削除を有効化] プロパティは、getVendorConnection
を明示的に呼び出すアプリケーションにのみ適用されます。
コード リスト 5-2ベンダ固有の呼び出しに対する接続を閉じるためのサンプル コード
// ベンダ固有の呼び出しの使用が完了したら、
// 接続への参照を即座に破棄する
// 参照は保持したり閉じたりしない
// 汎用 JDBC にはベンダ接続を使用しない
// 標準の JDBC には、論理的な (プールされた) 接続を使用する
vendorConn = null;
... do all the JDBC needed for the whole method...
// 論理的な (プールされた) 接続を閉じて
// 接続プールに戻し、参照を破棄する
conn.close();
}
conn = null;
catch (Exception e)
{
// 例外を処理する
}
finally
{
// 念のため、論理的な (プールされた) 接続が閉じられているか
// どうか確認する
// finally ブロックの冒頭では、必ず論理的な (プールされた) 接続
// を閉じる
[影響のある接続の削除を有効化] が MtrueM (デフォルト値) に設定されている場合、論理的な接続を閉じると、サーバ インスタンスは基底の物理的な接続を破棄してこれに代わる新しい接続を作成します。これによりプールは、次のユーザがそのプール接続を使用する唯一のユーザであることを保証できます。このコンフィグレーションでは、容易かつ安全に接続を閉じることができます。ただし、次の理由によりパフォーマンスが低下します。
注意 : [影響のある接続の削除を有効化] を 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 では、これらのクラスの拡張機能メソッドにアクセスするために、独自のインタフェースを提供しています。
weblogic.jdbc.vendor.oracle.OracleArray
weblogic.jdbc.vendor.oracle.OracleStruct
weblogic.jdbc.vendor.oracle.OracleRef
weblogic.jdbc.vendor.oracle.OracleThinBlob
weblogic.jdbc.vendor.oracle.OracleThinClob
以降の節では、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 配列として callable statement を使用することにより、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();
callable statement、または結果セットに 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 を更新するには、次の手順に従います。
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 を使用するには、次の手順に従います。
データベース オブジェクトを 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 メソッド、または getOracleAttributes()
の Oracle 拡張機能メソッドを使用できます。
標準メソッドを使用するには、まず結果セットを作成し、この結果セットから 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 を使用してデータベースのオブジェクトを更新するには、prepared statement にある 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 値を割り当てたりすることができます。
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
としてキャストした後は、getBaseTypeName
の Java API メソッドが使用できます (これは 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)
メソッドを使用して、基盤となるテーブルの値を変更する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 が指示するテーブルの値が更新されます。
prepared statement を使用して REF が指示する位置を更新するには、次の 3 つの基本手順に従います。
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 としてキャストする
}
// prepared statement の作成と実行
String sqlUpdate = "update t3 s2 set col = ? where s2.col.ob1=20";
pstmt = conn.prepareStatement(sqlUpdate);
pstmt.setRef(1, ref);
pstmt.executeUpdate();
callable statement を使用して、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 オブジェクトが検索されるだけです。ただし、文または prepared statement を使用して、データベースに 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
インタフェースをキャストしたら、BEA がサポートするメソッドにアクセスできます。
PreparedStatement を使用して CLOB を更新し、新しい値が以前の値より短い場合、CLOB は更新中に明示的に置換されなかった文字を保持します。たとえば、CLOB の現在の値が abcdefghij
の場合に、PreparedStatement を使用して zxyw
で CLOB を更新すると、CLOB の値が zxywefghij
に更新されます。PreparedStatement で更新された値を修正するには、dbms_lob.trim
プロシージャを使用して、更新後に残った余分な文字を削除します。dbms_lob.trim
プロシージャの詳細については、Oracle のマニュアルを参照してください。
Oracle Virtual Private Database (VPD) は、サーバによって強制されるアプリケーション定義のファイン グレイン アクセス制御と、Oracle 9i データベース サーバのセキュアなアプリケーション コンテキストを組み合わせたものです。WebLogic Server アプリケーションで VPD を使用するには、以下の手順に従います。
注意 : XA 対応の JDBC ドライバを使用している場合は、KeepXAConnTillTxComplete=true
を設定する必要があります。Administration Console オンライン ヘルプの「追加の XA 接続プール プロパティ」を参照してください。
WebLogic jDriver for Oracle は ClientIdentifier
を伝播できないため、VPD で使用するドライバとしては適していません。
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 8.1 SP2 以降では、プールされた接続からの基底の物理的な接続を使用せずに、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-6 を参照してください。表に示された代わりのインタフェースを使用することをお勧めします。
表 5-7 に示すインタフェースは、これらの拡張機能メソッドにアクセスするインタフェースを Oracle が提供していないため、引き続き有効です。
Oracle インタフェースを以下の表に示します。また、標準 JDBC (java.sql.*
) インタフェースを拡張するために Oracle Thin Driver (またはこれらのメソッドをサポートするその他のドライバ) で使用するメソッドでサポートされているものも示します。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![]() ![]() |
![]() |
![]() |