BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

WebLogic JDBC プログラマーズ ガイド

 Previous Next Contents PDF で侮ヲ  

WebLogic Server でのサードパーティ ドライバの使い方

以下の節では、サードパーティ JDBC ドライバの設定および使用方法について説明します。

 


ードパーティ JDBC ドライバの概要

WebLogic Server は、以下の機能を提供するサードパーティ JDBC ドライバと連携して機能します。

この節では、以下のサードパーティ JDBC ドライバを WebLogic Server で設定して使用する方法について説明します。

WebLogic Server 6.1 では、Oracle Thin Driver と Sybase jConnect Driver は、weblogic.jar にバンドルされています。バージョン 7.x では、サードパーティの JDBC ドライバは weblogic.jar のバンドルから除外されます。代わりに、Oracle Thin Driver 10g (classes12.zip) と、Sybase jConnect Driver の 4.5 (jConnect.jar) および 5.5 (jconn2.jar) の各バージョンが weblogic.jarWL_HOME¥server¥lib フォルダにインストールされます (なお WL_HOME は WebLogic Platform がインストールされるフォルダ)。weblogic.jar のマニフェストには、これらのファイルがリストされており、weblogic.jar のロード時 (サーバの起動時) にロードできます。

注意: WebLogic Server 7.0SP5 では、Oracle Thin Driver のデフォルト バージョンは 10g ドライバ (WL_HOME¥server¥lib のバージョン) に変更されました。 WebLogic Server 7.0SP2、SP3、および SP4 では、Oracle Thin Driver 9.2.0 がドライバのデフォルト バージョンでした。 サービス パック 2 より前のリリースの WebLogic Server 7.0 では、Oracle Thin Driver のデフォルトのバージョンは 8.1.7 でした。

インストールされた WebLogic Server の WL_HOME¥server¥ext¥jdbc フォルダ (WL_HOME は WebLogic Platform がインストールされるフォルダ) には、Oracle と Sybase の 各 JDBC ドライバのサブフォルダが入っています。 図 5-1 を参照してください。

図5-1 WebLogic Server と共にインストールされる JDBC ドライバのディレクトリ構造


 

oracle フォルダには、バージョン 10g を含む Oracle Thin Driver の各バージョンが入っています (前述のとおり、WL_HOME¥server¥lib フォルダにもある)。 これらのファイルは、WL_HOME¥server¥lib フォルダにコピーすることにより、Oracle Thin Driver のバージョンを変更したり、デフォルトのバージョンに戻したりできます。 詳細については、Oracle Thin Driver の変更または更新を参照してください。

sybase フォルダには、Sybase jConnect Driver 4.5 と Sybase jConnect Driver 5.5 および各サポート ファイルを含むサブフォルダがあります。前述のとおり、各ドライバ (jConnect.jar と jconn2.jar) は、WL_HOME¥server¥lib フォルダに、ディレクトリ構造やサポート ファイルなしで、インストールされます。WebLogic Server の実行中は、WL_HOME¥server¥lib フォルダにあるファイルが使用されます。不良なドライバやサポート対象外のドライバの更新時に、バックアップとして WL_HOME¥server¥ext¥jdbc¥sybase フォルダにある追加コピーを利用できます。

これらのドライバのデフォルト バージョンを使用する場合は、いずれの変更も必要ありません。また、別のバージョンのドライバを使用する場合は、WL_HOME¥server¥lib のファイルを WL_HOME¥server¥ext¥jdbc¥oracle¥version (version は使用する JDBC ドライバのバージョン) のファイル、または DBMS ベンダ (Oracle または Sybase) のファイルに置き換えます。

weblogic.jar のマニフェストには、WL_HOME¥server¥lib にある Oracle Thin Driver と Sybase jConnect Driver のクラス ファイルがリストされているため、weblogic.jar のロード時 (サーバの起動時) に、各ドライバがロードされます。したがって、CLASSPATH に JDBC ドライバを追加する必要はありません。また、WebLogic Server にはインストールされていないサードパーティの JDBC ドライバを使用する場合は、CLASSPATH にドライバ ファイルのパスを追加します。

 


サードパーティの JDBC ドライバに対する環境設定

WebLogic Server 7.0 には含まれていない Oracle Thin Driver または Sybase jConnect Driver 以外のサードパーティの JDBC ドライバを使用する場合は、CLASSPATH に JDBC のドライバ クラスに対するパスを追加する必要があります。サードパーティの JDBC ドライバを使用するときに Windows、および UNIX の環境に合わせた CLASSPATH を設定する方法について以下の節で説明します。

Windows でのサードパーティ JDBC ドライバの CLASSPATH

次のように、CLASSPATH に JDBC ドライバ クラスと weblogic.jar へのパスを指定します。

set CLASSPATH=DRIVER_CLASSES;WL_HOME¥server¥lib¥weblogic.jar;
%CLASSPATH%

ここで、DRIVER_CLASSES は、JDBC ドライバ クラスへのパス、WL_HOME は、WebLogic Platform をインストールするディレクトリを表します。

UNIX でのサードパーティ JDBC ドライバの CLASSPATH

次のように、CLASSPATH に JDBC ドライバ クラスと weblogic.jar へのパスを追加します。

export CLASSPATH=DRIVER_CLASSES:WL_HOME/server/lib/weblogic.jar:
$CLASSPATH

ここで、DRIVER_CLASSES は、JDBC ドライバ クラスへのパス、WL_HOME は、WebLogic Platform をインストールするディレクトリを表します。

Oracle Thin Driver の変更または更新

WebLogic Server にバンドルされた Oracle Thin Driver 10g (10.1.0.2.0) は事前にコンフィグレーションされ、そのまま使用できる状態になっています。別のバージョンを使用する場合は、WL_HOME¥server¥lib¥classes12.zip を該当するバージョンのファイルに置き換えてください。 たとえば、Oracle Thin Driver 9.2.0 を使用する場合は、WL_HOME¥server¥ext¥jdbc¥oracle¥920 フォルダから classes12.zip をコピーし、それを WL_HOME¥server¥lib に置いて、そのフォルダにあるバージョン 10g と置き換える必要があります。

注意: WebLogic Server 7.0SP5 では、Oracle Thin Driver のデフォルト バージョンは 10g ドライバ (WL_HOME¥server¥lib にあるバージョン) に変更されました。 WebLogic Server 7.0SP2、SP3、および SP4 では、Oracle Thin Driver 9.2.0 がドライバのデフォルト バージョンでした。 サービス パック 2 より前のリリースの WebLogic Server 7.0 では、Oracle Thin Driver のデフォルトのバージョンは 8.1.7 でした。

Oracle Thin Drive 9.2.0、9.0.1、または 8.1.7 を使用する場合は、次の手順に従います。

  1. Windows エクスプローラ、またはコマンド シェルで、使用するドライバのバージョンのフォルダに移動します。

  2. classes12.zip をコピーします。

  3. Windows エクスプローラ、またはコマンド シェルで、WL_HOME¥server¥lib に移動し、既存のバージョン、classes12.zip を、コピーしたバージョンに置き換えます。

バージョン 10g (デフォルト) に戻る場合は、上記の説明に従い、フォルダ WL_HOME¥server¥ext¥jdbc¥oracle¥10g からコピーします。

Oracle Thin Driver のバージョンを Oracle の新バージョンで更新する場合は、WL_HOME¥server¥libclasses12.zip を Oracle が提供する新しいファイルで置き換えてください。 ドライバのアップデートは、次の Oracle Web サイトからダウンロードできます。http://otn.oracle.com/software/content.html

注意: CLASSPATH に Oracle Thin Driver の複数のバージョンを指定することはできません。さまざまなメソッドでクラッシュが発生する可能性があります。

Oracle Thin Driver 9.x および 10g でのパッケージの変更

Oracle 8.x 以前のリリースでは、Oracle Thin Driver の含まれるパッケージは oracle.jdbc.driver でした。 Oracle 8.1.7 Thin Driver を使用する JDBC 接続プールをコンフィグレーションする際には、DriverName (ドライバのクラス名) を oracle.jdbc.driver.OracleDriver として指定します。 Oracle 9.x と 10g では、Oracle Thin Driver の含まれるパッケージは oracle.jdbc です。 Oracle 9.x または 10g Thin Driver を使用する JDBC 接続プールをコンフィグレーションする際には、DriverName (ドライバのクラス名) を oracle.jdbc.OracleDriver として指定します。 oracle.jdbc.driver.OracleDriver クラスは 9.x と 10g のドライバで使用できますが、このクラスは今後、機能の拡張が行われない場合もあります。

Oracle Thin Driver の詳細については、Oracle のマニュアルを参照してください。

注意: パッケージの変更は、XA バージョンのドライバには関係ありません。 Oracle Thin Driver の XA バージョンの場合、JDBC の接続プールで DriverName (ドライバのクラス名) としては oracle.jdbc.xa.client.OracleXADataSource を使用します。

nls_charset12.zip による文字セットのサポート

Oracle Thin ドライバには、Oracle のオブジェクト型またはコレクション型の一部として取得または挿入されない、すべての CHAR および NCHAR データ型の Oracle 文字セットに対するグローバリゼーション サポートが含まれています。

ただし、Oracle オブジェクトまたはコレクションの CHAR および VARCHAR データの部分に関しては、Oracle Thin ドライバには以下の文字セットのグローバリゼーション サポートのみ含まれています。

Oracle のオブジェクト型またはコレクションの中の CHAR および NCHAR データで他の文字セットを使用する場合は、CLASSPATHnls_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 の設定手順については、サードパーティの JDBC ドライバに対する環境設定を参照してください。

Sybase jConnect Driver の更新

WebLogic Server にバンドルされた Sybase jConnect Driver 4.5 および 5.5 は事前にコンフィグレーションされ、そのまま使用できる状態になっています。別のバージョンを使用する場合は、WL_HOME¥server¥lib¥jConnect.jar または jconn2.jar を DBMS ベンダが提供する別バージョンのファイルに置き換えてください。

WebLogic Server でインストールされたバージョンに戻す場合は、WL_HOME¥server¥lib フォルダに次のファイルをコピーします。

IBM Infomix JDBC Driver のインストールと使い方

WebLogic Server と Infomix データベースを使用する場合は、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 でドライバを使用できるように準備します。

  1. INFORMIX_INSTALL¥lib から ifxjdbc.jar ファイルおよび ifxjdbcx.jar ファイルをコピーして、WL_HOME¥server¥lib フォルダに貼り付けます。ここで、

    INFORMIX_INSTALL は、Informix JDBC ドライバをインストールしたルート ディレクトリです。

    また WL_HOME は、WebLogic Platform をインストールしたフォルダ (通常は c:¥bea¥weblogic700) です。

  2. CLASSPATHifxjdbc.jar および ifxjdbcx.jar へのパスを追加します。 次に例を示します。
    set CLASSPATH=%WL_HOME%¥server¥lib¥ifxjdbc.jar;%WL_HOME%¥server¥lib¥ifxjdbcx.jar;%CLASSPATH%

    また WebLogic Server の起動スクリプトで set CLASSPATH 文にドライバ ファイルへのパスを追加することもできます。

IBM Infomix JDBC Driver 使用時の接続プール属性

IBM Infomix JDBC Driver を使用する接続プールを作成するときは、表 5-1 および表 5-2 に示す属性を使用します。

表5-1 Infomix JDBC Driver 使用時の XA 非対応接続プールの属性

属性

[URL]

jdbc:informix-sqli:dbserver_name_or_ip:port/dbname:informixserver=ifx_server_name

[ドライバ クラス名]

com.informix.jdbc.IfxDriver

[プロパティ]

user=username
url=jdbc:informix-sqli:dbserver_name_or_ip:port/dbname:informixserver=ifx_server_name
portNumber=1543
databaseName=dbname
ifxIFXHOST=ifx_server_name
serverName=dbserver_name_or_ip

[パスワード]

password

[ログイン遅延時間]

1

[対象]

serverName

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"
/>

表5-2 Infomix JDBC Driver 使用時の XA 対応接続プールの属性

属性

[URL]

空白のまま

[ドライバ クラス名]

com.informix.jdbcx.IfxXADataSource

[プロパティ]

user=username
url=jdbc:informix-sqli://dbserver_name_or_ip:port_num/dbname:informixserver=dbserver_name_or_ip
password=password
portNumber =port_num;
databaseName=dbname
serverName=dbserver_name
ifxIFXHOST=dbserver_name_or_ip

[パスワード]

空白のまま

[ローカル トランザクションのサポート]

true

[対象]

serverName

注意: [プロパティ] の文字列の 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 Infomix JDBC Driver のプログラミング上の注意

IBM Informix JDBC Driver を使用するときは、次の制限について注意が必要です。

Microsoft SQL Server 2000 Driver for JDBC のインストールと使い方

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 Driver for JDBC の Windows システムへのインストール

Microsoft SQL Server 2000 Driver for JDBC を Windows サーバにインストールするには、次の手順に従います。

  1. Microsoft MSDN Web サイトから Microsoft SQL Server 2000 Driver for JDBC (setup.exe ファイル) をダウンロードします。そのファイルをローカル コンピュータ上の一時ディレクトリに保存します。

  2. 一時ディレクトリから setup.exe を実行し、画面の指示に従います。

  3. CLASSPATH に以下のファイルへのパスを追加します。

    ここで、install_dir はドライバをインストールしたフォルダです。 次に例を示します。

    set CLASSPATH=install_dir¥lib¥msbase.jar;
    install_dir¥lib¥msutil.jar;install_dir¥lib¥mssqlserver.jar;
    %CLASSPATH%

Microsoft SQL Server Driver for JDBC の UNIX システムへのインストール

Microsoft SQL Server 2000 Driver for JDBC を UNIX サーバにインストールするには、次の手順に従います。

  1. Microsoft MSDN Web サイトから Microsoft SQL Server 2000 Driver for JDBC (mssqlserver.tar ファイル) をダウンロードします。そのファイルをローカル コンピュータ上の一時ディレクトリに保存します。

  2. 一時ディレクトリに移動し、次のコマンドを使用してファイルの内容を復元します。
    tar -xvf mssqlserver.tar

  3. 次のコマンドを実行して、インストール スクリプトを実行します。
    install.ksh

  4. 画面の指示に従います。インストール ディレクトリの入力を要求された場合は、必ずそのディレクトリの絶対パスを入力してください。

  5. CLASSPATH に以下のファイルへのパスを追加します。

    ここで、install_dir はドライバをインストールしたフォルダです。 次に例を示します。

    export CLASSPATH=install_dir/lib/msbase.jar:
    install_dir/lib/msutil.jar:install_dir/lib/mssqlserver.jar:
    $CLASSPATH

Microsoft SQL Server Driver for JDBC 使用時の接続プール属性

Microsoft SQL Server Driver for JDBC を使用する接続プールを作成するときは、次の属性を使用します。

config.xml のエントリは、次のようになります。

    <JDBCConnectionPool
Name="mssqlDriverTestPool"
DriverName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
URL="jdbc:microsoft:sqlserver://lcdbnt4:1433"
Properties="databasename=lcdbnt4;user=sa;
selectMethod=cursor"
Password="{3DES}vlsUYhxlJ/I="
InitialCapacity="4"
CapacityIncrement="2"
MaxCapacity="10"
Targets="examplesServer"
/>

注意: 接続をトランザクション モードで使用するには、接続プロパティのリストに selectMethod=cursor を追加する必要があります。 このように設定することで、アプリケーションで特定の接続から同時に複数の文を開くことが可能となります。これは、プールされた接続において必要となります。

selectMethod=cursor を設定しない場合は、同時に開いた文ごとに、接続の内部的なクローンが別々の DBMS ユーザとして作成されます。 この場合、トランザクションを同時にコミットできなくなるため、デッドロックが発生するおそれがあります。

 


サードパーティ ドライバを使用した接続の取得

Oracle Thin Driver や Sybase jConnect Driver などのサードパーティ Type 4 ドライバを使用してデータベース接続を取得する方法について以下の節で説明します。接続を確立するには、接続プール、データ ソース、および JNDI ルックアップを使用することをお勧めします。

サードパーティ ドライバでの接続プールの使い方

まず、Administration Console を使用して接続プールとデータ ソースを作成し、次に JNDI ルックアップを使用して接続を確立します。

接続プールと DataSource の作成

JDBC 接続プールと JDBC DataSource の作成手順については、接続プールのコンフィグレーションと使い方およびDataSource のコンフィグレーションと使い方を参照してください。

JNDI を使用した接続の取得

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");
  try {
ctx = new InitialContext(ht);
javax.sql.DataSource ds
= (javax.sql.DataSource) ctx.lookup ("myDataSource");
java.sql.Connection conn = ds.getConnection();
   // これで conn オブジェクトを使用して 
// Statement オブジェクトを作成して
// SQL 文を実行し、結果セットを処理できる
Statement stmt = conn.createStatement();
stmt.execute("select * from someTable");
ResultSet rs = stmt.getResultSet();
   // 完了したら、文オブジェクトと
// 接続オブジェクトを忘れずにクローズすること
   stmt.close();
conn.close();
}
catch (NamingException e) {
// エラー発生
}
finally {
try {ctx.close();}
catch (Exception e) {
// エラー発生
}
}

(hostname は WebLogic Server が稼働するマシンのホスト名、port は WebLogic Server がリクエストをリスンするポートの番号です。)

この例では、Hashtable オブジェクトを使って、JNDI ルックアップに必要なパラメータを渡しています。JNDI ルックアップを実行する方法は他にもあります。 詳細については、『WebLogic JNDI プログラマーズ ガイド』を参照してください。

ルックアップの失敗を捕捉するために JNDI ルックアップが try/catch ブロックで包まれている点に注意してください。また、コンテキストが finally ブロックの中でクローズされている点にも注意してください。

接続プールからの物理的な接続の取得

接続プールから接続を取得すると、WebLogic Server によって物理的な接続ではなく論理的な接続が提供されます。これは、接続を接続プールを使用して管理できるようにするためです。 これにより、接続プール機能を有効にし、アプリケーションに提供する接続の品質を維持することが可能となります。 しかし、物理的な接続を使用したい場合もあります。たとえば、DBMS ベンダの接続クラスを必要とするベンダ固有のメソッドに接続を渡す必要がある場合などです。 WebLogic Server では、weblogic.jdbc.extensions.WLConnection インタフェースに getVendorConnection() メソッドが含まれており、論理的な接続から、その基底となる物理的な接続を取得することができます。 詳細については、WebLogic Javadoc を参照してください。

注意: 物理的な接続は、接続プールから取得した論理的な接続の代りとして使用しないようにしてください。 詳細については、物理的な接続を使用する際の制限事項を参照してください。

物理的なデータベース接続は、ベンダ固有の必要性がある場合にのみ使用します。 ほとんどの JDBC 呼び出しは、論理的な接続に対してコーディングしておく必要があります。

接続の使用が完了したら、論理的な接続をクローズします。 物理的な接続をコード内でクローズしないようにしてください。

物理的なデータベース接続をアプリケーション コードにエクスポーズした場合、その接続に対してアクセス権限を持たないユーザが接続にアクセスできてしまうおそれがあります。 そのため WebLogic Server では、論理的な接続がクローズされると、これを接続プールに戻します。その基底となる物理的な接続は破棄され、プール内の論理的な接続に対する物理的な接続が新たに開かれます。 この方式は安全である反面、処理には時間がかかります。 接続プールへの要求が発生するごとに、新しいデータベース接続が作成されるようにすることは可能です。

物理的な接続を取得するサンプル コード

物理的なデータベース接続を取得するには、最初にJNDI を使用した接続の取得の説明に従って接続プールから接続を取得してから、次のいずれかを行います。

次に例を示します。

// このクラスと、必要となるすべてのベンダ パッケージをイン
// ポートする
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();
     // これで conn オブジェクトの WLConnection インタフェース 
// へのキャストが可能となり、基底となる物理的な接続を取得できる
     java.sql.Connection vendorConn = 
((WLConnection)conn).getVendorConnection();

// vendorConn はクローズしない
     // vendorConn オブジェクトをベンダ インタフェースにキャストするこ
// とも可能。次に例を示す
// oracle.jdbc.OracleConnection vendorConn = (OracleConnection)
// ((WLConnection)conn).getVendorConnection()
     // ベンダ固有のメソッドで物理的な接続が必要に
// なる場合、物理的な接続を取得または保持するのではなく、
// 必要に応じて暗黙的に渡すほうがよい
// 次に例を示す
     //vendor.special.methodNeedingConnection(((WLConnection)conn)).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){} 
}
}

物理的な接続を使用する際の制限事項

物理的な接続は、接続プールから取得した論理的な接続の代りとして使用しないようにしてください。 ただし、STRUCT を作成するためなど、どうしても物理的な接続を使用しなければならない場合は、以下のデメリットと制限事項を考慮に入れてください。

 


Oracle 拡張機能と Oracle Thin Driver の使用

Oracle 拡張機能では、Oracle データベースのデータを操作するための独自の方法が追加されます。これにより、標準 JDBC インタフェースの機能が拡張されます。BEA では、Oracle Thin Driver や Oracle 拡張機能をサポートする他のドライバに対応できるように、拡張機能をサポートしています。

以降の節では、Oracle 拡張機能のサンプル コードと、サポートされるメソッドの表を示します。詳細については、Oracle のマニュアルを参照してください。

Oracle JDBC 拡張機能の使用時の制限

JDBC インタフェースに Oracle 拡張機能を使用するときは、次の制限があります。

Oracle 拡張機能から JDBC インタフェースにアクセスするサンプル コード

以下のコード例は、WebLogic Oracle 拡張機能から標準 JDBC インタフェースにアクセスする方法を示しています。最初の例では、OracleConnection および OracleStatement 拡張機能を使用します。この例の構文は、WebLogic Server でサポートされるメソッドを使用する場合、OracleResultSetOraclePreparedStatement、および OracleCallableStatement インタフェースで使用できます。 サポートされるメソッドについては、Oracle 拡張機能インタフェースとサポートされるメソッドの表を参照してください。

その他の Oracle 拡張機能メソッドを使用した例については、以下の節を参照してください。

WebLogic Server を使用して、サーバの例をインストールするオプションを選択した場合は、JDBC 例を参照してください。この例は通常、WL_HOME¥samples¥server¥src¥examples¥jdbc (WL_HOME は WebLogic Platform をインストールしたフォルダ) にあります。

Oracle 拡張機能へアクセスするパッケージをインポートする

この例で使用する Oracle インタフェースをインポートします。OracleConnection および OracleStatement インタフェースは、oracle.jdbc.OracleConnection および oracle.jdbc.OracleStatement に相当し、WebLogic Server でサポートされるメソッドを使用する場合は、これらの Oracle インタフェースと同様に使用できます。

import java.sql.*;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
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();

デフォルトの行プリフェッチ値を取得する

次のコードでは、Oracle Thin Driver で使用できる Oracle の行プリフェッチ メソッドの使い方を示します。

// OracleConnection にキャストして、この接続の
// デフォルトの行プリフェッチ値を取得する
int default_prefetch =
((OracleConnection)conn).getDefaultRowPrefetch();
System.out.println("Default row prefetch
is " + default_prefetch);
java.sql.Statement stmt = conn.createStatement();
// OracleStatement にキャストして、この文の
// 行プリフェッチ値を設定する
// このプリフェッチ値は、WebLogic Serverとデータベースの
// 間の接続に適用されることに注意
((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;
}

ARRAY によるプログラミング

WebLogic Server のサーバサイド アプリケーションでは、結果セット、または Java 配列として callable statement を使用することにより、Oracle Collection (SQL ARRAY) を実体化できます。

WebLogic Server アプリケーションで ARRAY を使用するには、次の手順に従います。

  1. 必要なクラスをインポートします(Oracle 拡張機能へアクセスするパッケージをインポートするを参照)。

  2. 接続を取得 (接続を確立するを参照) して、接続のための文を作成します。

  3. 結果セット、または callable statement を使用して ARRAY を取得します。

  4. java.sql.Array または weblogic.jdbc.vendor.oracle.OracleArray のいずれかとして、ARRAY を使用します。

  5. 標準 Java メソッド (java.sql.Array として使用)、または Oracle 拡張機能メソッド (weblogic.jdbc.vendor.oracle.OracleArray としてキャスト) を使用して、データを操作します。

以下の節では、これらのアクションの詳細について説明します。

注意: ARRAY はサーバサイド アプリケーションでのみ使用できます。クライアント アプリケーションでは ARRAY は使用できません。

ARRAY を取得する

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 を更新する

データベースにおける ARRAY を更新するには、次の手順に従います。

  1. 更新する配列がデータベースにない場合、PL/SQL を使用してデータベースに配列を作成します。

  2. 結果セット、または callable statement を使用して ARRAY を取得します。

  3. Java アプリケーション内の配列を java.sql.Array または weblogic.jdbc.vendor.oracle.OracleArray として扱います。

  4. prepared statement または callable statement に setArray() メソッドを使用して、データベース内の配列を更新します。次に例を示します。 次に例を示します。
    String sqlUpdate = "UPDATE SCOTT."+ tableName + " SET col1 = ?";
    conn = ds.getConnection();
    pstmt = conn.prepareStatement(sqlUpdate);
    pstmt.setArray(1, array);
    pstmt.executeUpdate();

Oracle Array 拡張機能メソッドを使用する

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()

STRUCT によるプログラミング

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 を使用するには、次の手順に従います。

  1. 必要なクラスをインポートします (Oracle 拡張機能へアクセスするパッケージをインポートするを参照) 。

  2. 接続を取得します (接続を確立するを参照)。

  3. getObject を使用して STRUCT を取得します。

  4. STRUCT を java.sql.Struct または weblogic.jdbc.vendor.oracle.OracleStruct の STRUCT としてキャストします。

  5. 標準メソッド、または Oracle 拡張機能メソッドを使用して、データを操作します。

以下の節では、手順 3 〜 5 について詳しく説明します。

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 としてキャストすると、標準メソッドと拡張機能メソッドの両方が使用できるようになります。

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 属性を取得する

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 によってデータベース オブジェクトを更新する

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 属性を自動バッファリングする

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 を使用して、これが参照するオブジェクトを検証したり、更新したりできます。また REF を変更することにより、同じオブジェクト タイプの別のオブジェクトを指示したり、null 値を割り当てたりすることができます。

注意: REF を使用する場合、次の制限があります。

WebLogic Server アプリケーションで REF を使用するには、次の手順に従います。

  1. 必要なクラスをインポートします (Oracle 拡張機能へアクセスするパッケージをインポートするを参照) 。

  2. データベース接続を取得します (接続を確立するを参照)。

  3. 結果セット、または callable statement を使用して REF を取得します。

  4. 結果を STRUCT として、または Java オブジェクトとしてキャストします。これにより、STRUCT メソッド、または Java オブジェクトのメソッドを使用して、データを操作できるようになります。

また、データベースで REF を作成したり、更新したりできます。

手順 3 と 4 について以下の節で詳しく説明します。

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 としてキャストする場合に限って使用できます。

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);

REF 値を更新する

REF を更新する場合、次のいずれかの操作を実行します。

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 つの基本手順に従います。

  1. 新しい位置を指示する REF を取得します。この REF を使用して、別の REF の値を置き換えます。

  2. SQL コマンドの文字列を作成して、既存の REF の位置を、別の REF の値で置き換えます。

  3. prepared statement を作成、および実行します。

次に例を示します。

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();

データベースで REF を作成する

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)。

BLOB と CLOB によるプログラミング

この節では、OracleBlob インタフェースへのアクセス方法を示すサンプル コードについて説明します。WebLogic Server でサポートされるメソッドを使用している場合、この例で示す構文は、OracleBlob インタフェースで使用できます。 Oracle 拡張機能インタフェースとサポートされるメソッドの表を参照してください。

注意: BLOB および CLOB (「LOB」と呼ばれる) を使用する場合、トランザクションの境界を考慮する必要があります。たとえば、すべての読み取り/書き込みをトランザクション内の特定の LOB に転送します。 詳細については、Oracle Web サイトにある Oracle のマニュアルの「LOB Locators and Transaction Boundaries」を参照してください。

DBMS から BLOB ロケータを選択するクエリを実行する

BLOB ロケータまたはハンドルは、Oracle Thin Driver Blob への参照です。

String selectBlob = "select blobCol from myTable where blobKey = 666"

WebLogic Server java.sql オブジェクトを宣言する

次のコードでは、Connection が既に確立されていることを前提としています。

ResultSet rs = null;
Statement myStatement = null;
java.sql.Blob myRegularBlob = null;
java.io.OutputStream os = null;

SQL 例外ブロックを開始する

この 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 値の更新

PreparedStatement を使用して CLOB を更新し、新しい値が以前の値より短い場合、CLOB は更新中に明示的に置換されなかった文字を保持します。たとえば、CLOB の現在の値が abcdefghij の場合に、PreparedStatement を使用して zxyw で CLOB を更新すると、CLOB の値が zxywefghij に更新されます。PreparedStatement で更新された値を修正するには、dbms_lob.trim プロシージャを使用して、更新後に残った余分な文字を削除します。dbms_lob.trim プロシージャの詳細については、Oracle のマニュアルを参照してください。

 


Oracle 仮想プライベート データベースによるプログラミング

WebLogic Server 7.0 SP3 では、Oracle 仮想プライベート データベース (Virtual Private Database : VPD) がサポートされています。 VPD を使用することで、アプリケーション定義のファイングレイン アクセス コントロールをサーバで実施し、Oracle 9i データベース サーバ内のアプリケーション コンテキストのセキュリティを確保できます。

WebLogic Server アプリケーションで VPD を使用するには、以下の手順に従います。

  1. Oracle Thin ドライバまたは Oracle OCI ドライバを使用する WebLogic Server コンフィグレーション内に JDBC 接続プールを作成します。 詳細については、WebLogic JDBC のコンフィグレーションと管理、または『管理者ガイド』の「Administration Console を使用した JDBC 接続のコンフィグレーション」を参照してください。

    注意: XA 対応の JDBC ドライバを使用している場合は、KeepXAConnTillTxComplete=true を設定する必要があります。 詳細については、『管理者ガイド』の「追加の XA 接続プール プロパティ」を参照してください。

    WebLogic jDriver for Oracle は ClientIdentifier を伝播できないため、VPD で使用するドライバとしては適していません。

  2. 接続プールを指す WebLogic Server コンフィグレーション内にデータ ソースを作成します。

  3. アプリケーションで次のコードを実行します。
import weblogic.jdbc.vendor.oracle.OracleConnection;
// WLS JDBC 接続プールから接続を取得する
Connection conn = ds.getConnection();
// Oracle 拡張機能にキャストして CLIENT_IDENTIFIER を設定する
// (データベース サーバ サイドの USERENV ネーミング コンテキスト
// からアクセス可能になる)
((OracleConnection)conn).setClientIdentifier(clientId);
/* アプリケーション固有の処理を実行する */
// WLS JDBC 接続プールに戻る前に接続をクリーンアップする
((OracleConnection)conn).clearClientIdentifier(clientId);
// 接続をクローズする
conn.close();

 


Oracle 拡張機能インタフェースとサポートされるメソッドの表

Oracle インタフェースを以下の表に示します。また、標準 JDBC (java.sql.*) インタフェースを拡張するために Oracle Thin Driver (またはこれらのメソッドをサポートするその他のドライバ) で使用するメソッドでサポートされているものも示します。

注意: 通常、Oracle Thin Driver の新しいバージョンがリリースされるときには、一部の拡張機能メソッドがドライバから削除されます。WebLogic Server では、ドライバに含まれなくなったメソッドをサポートできません。Oracle Thin Driver 9.2.0 (および WebLogic Server 7.0 サービス パック 2) では、以下のメソッドが削除されています。

表5-3 OracleConnection インタフェース

拡張

メソッド シグネチャ

OracleConnection
拡張 java.sql.Connection


boolean getAutoClose() 
throws java.sql.SQLException;
void setAutoClose(boolean on) throws
java.sql.SQLException;
String getDatabaseProductVersion()
throws java.sql.SQLException;
String getProtocolType() throws
java.sql.SQLException;
String getURL() throws java.sql.SQLException;
String getUserName()
throws java.sql.SQLException;
boolean getBigEndian() 
throws java.sql.SQLException;
boolean getDefaultAutoRefetch() throws
java.sql.SQLException;
boolean getIncludeSynonyms()
throws java.sql.SQLException;
boolean getRemarksReporting()
throws java.sql.SQLException;
boolean getReportRemarks() 
throws java.sql.SQLException;
boolean getRestrictGetTables()
throws java.sql.SQLException;
boolean getUsingXAFlag()
throws java.sql.SQLException;
boolean getXAErrorFlag() 
throws java.sql.SQLException;

OracleConnection
拡張 java.sql.Connection

(続き)

byte[] getFDO(boolean b) 
throws java.sql.SQLException;
int getDefaultExecuteBatch() throws 
java.sql.SQLException;
int getDefaultRowPrefetch() 
throws java.sql.SQLException;
int getStmtCacheSize() 
throws java.sql.SQLException;
java.util.Properties getDBAccessProperties()
throws java.sql.SQLException;
short getDbCsId() throws java.sql.SQLException;
short getJdbcCsId() throws java.sql.SQLException;
short getStructAttrCsId() 
throws java.sql.SQLException;
short getVersionNumber() 
throws java.sql.SQLException;
void archive(int i, int j, String s) 
throws java.sql.SQLException;
void close_statements() 
throws java.sql.SQLException;
void initUserName() throws java.sql.SQLException;
void logicalClose() throws java.sql.SQLException;
void needLine() throws java.sql.SQLException;
void printState() throws java.sql.SQLException;
void registerSQLType(String s, String t) 
throws java.sql.SQLException;
void releaseLine() throws java.sql.SQLException;  

OracleConnection
拡張 java.sql.Connection

(続き)

void removeAllDescriptor() 
throws java.sql.SQLException;
void removeDescriptor(String s) 
throws java.sql.SQLException;
void setDefaultAutoRefetch(boolean b)
throws java.sql.SQLException;
void setDefaultExecuteBatch(int i) 
throws java.sql.SQLException;
void setDefaultRowPrefetch(int i) 
throws java.sql.SQLException;
void setFDO(byte[] b)
throws java.sql.SQLException;
void setIncludeSynonyms(boolean b) 
throws java.sql.SQLException;
void setPhysicalStatus(boolean b) 
throws java.sql.SQLException;
void setRemarksReporting(boolean b) 
throws java.sql.SQLException;
void setRestrictGetTables(boolean b) 
throws java.sql.SQLException;
void setStmtCacheSize(int i) 
throws java.sql.SQLException;
void setStmtCacheSize(int i, boolean b) 
throws java.sql.SQLException;
void setUsingXAFlag(boolean b)
throws java.sql.SQLException;
void setXAErrorFlag(boolean b) 
throws java.sql.SQLException;
void shutdown(int i) 
throws java.sql.SQLException;
void startup(String s, int i)
throws java.sql.SQLException;

表5-4 OracleStatement インタフェース

拡張

メソッド シグネチャ

OracleStatement
拡張 java.sql.statement

String getOriginalSql() 
throws java.sql.SQLException;
String getRevisedSql() 
throws java.sql.SQLException;
(Oracle 8.1.7 で非推奨、Oracle 9i で破棄)
boolean getAutoRefetch() 
throws java.sql.SQLException;
boolean is_value_null(boolean b, int i) 
throws java.sql.SQLException;
byte getSqlKind() 
throws java.sql.SQLException;
int creationState()
throws java.sql.SQLException;
int getRowPrefetch() 
throws java.sql.SQLException;
int sendBatch() 
throws java.sql.SQLException;
void clearDefines() 
throws java.sql.SQLException;
void defineColumnType(int i, int j) 
throws java.sql.SQLException;
void defineColumnType(int i, int j, String s)
throws java.sql.SQLException;

OracleStatement
拡張 java.sql.statement

(続き)

void defineColumnType(int i, int j, int k) 
throws java.sql.SQLException;
void describe() 
throws java.sql.SQLException;
void notify_close_rset() 
throws java.sql.SQLException;
void setAutoRefetch(boolean b) 
throws java.sql.SQLException;
void setAutoRollback(int i) 
throws java.sql.SQLException;
(非推奨)
void setRowPrefetch(int i) 
throws java.sql.SQLException;
void setWaitOption(int i) 
throws java.sql.SQLException;
(非推奨)

表5-5 OracleResultSet インタフェース

拡張

メソッド シグネチャ

OracleResultSet
拡張 java.sql.ResultSet

boolean getAutoRefetch() throws java.sql.SQLException;
int getFirstUserColumnIndex() 
throws java.sql.SQLException;
void closeStatementOnClose() 
throws java.sql.SQLException;
void setAutoRefetch(boolean b) 
throws java.sql.SQLException;
java.sql.ResultSet getCursor(int n) 
throws java.sql.SQLException;
java.sql.ResultSet getCURSOR(String s) 
throws java.sql.SQLException;

表5-6 OracleCallableStatement インタフェース

拡張

メソッド シグネチャ

OracleCallableStatement
拡張
java.sql.CallableStatement

void clearParameters() 
throws java.sql.SQLException;
void registerIndexTableOutParameter(int i,
int j, int k, int l)
throws java.sql.SQLException;
void registerOutParameter
(int i, int j, int k, int l)
throws java.sql.SQLException;
java.sql.ResultSet getCursor(int i) 
throws java.sql.SQLException;
java.io.InputStream getAsciiStream(int i)
throws java.sql.SQLException;
java.io.InputStream getBinaryStream(int i)
throws java.sql.SQLException;
java.io.InputStream getUnicodeStream(int i)
throws java.sql.SQLException;

.

表5-7 OraclePreparedStatement インタフェース

拡張

メソッド シグネチャ

OraclePreparedStatement
拡張
OracleStatement および java.sql. PreparedStatement

int getExecuteBatch() 
throws java.sql.SQLException;
void defineParameterType(int i, int j, int k) 
throws java.sql.SQLException;
void setDisableStmtCaching(boolean b) 
throws java.sql.SQLException;
void setExecuteBatch(int i) 
throws java.sql.SQLException;
void setFixedCHAR(int i, String s) 
throws java.sql.SQLException;
void setInternalBytes(int i, byte[] b, int j)
throws java.sql.SQLException;

表5-8 OracleArray インタフェース

拡張

メソッド シグネチャ

OracleArray
拡張 java.sql.Array


public ArrayDescriptor getDescriptor() 
throws java.sql.SQLException;
public Datum[] getOracleArray() 
throws SQLException;
public Datum[] getOracleArray(long l, int i) 
throws SQLException;
public String getSQLTypeName()
throws java.sql.SQLException;
public int length()
throws java.sql.SQLException;
public double[] getDoubleArray()
throws java.sql.SQLException;
public double[] getDoubleArray(long l, int i)
throws java.sql.SQLException;
public float[] getFloatArray()
throws java.sql.SQLException;
public float[] getFloatArray(long l, int i)
throws java.sql.SQLException;
public int[] getIntArray()
throws java.sql.SQLException;
public int[] getIntArray(long l, int i)
throws java.sql.SQLException;
public long[] getLongArray()
throws java.sql.SQLException;
public long[] getLongArray(long l, int i)
throws java.sql.SQLException;

OracleArray
拡張 java.sql.Array

(続き)

public short[] getShortArray()
throws java.sql.SQLException;
public short[] getShortArray(long l, int i)
throws java.sql.SQLException;
public void setAutoBuffering(boolean flag)
throws java.sql.SQLException;
public void setAutoIndexing(boolean flag)
throws java.sql.SQLException;
public boolean getAutoBuffering()
throws java.sql.SQLException;
public boolean getAutoIndexing()
throws java.sql.SQLException;
public void setAutoIndexing(boolean flag, int i)
throws java.sql.SQLException;

表5-9 OracleStruct インタフェース

拡張

メソッド シグネチャ

OracleStruct
拡張 java.sql.Struct


public Object[] getAttributes() 
throws java.sql.SQLException;
public Object[] getAttributes(java.util.Dictionary map)
throws java.sql.SQLException;
public Datum[] getOracleAttributes() 
throws java.sql.SQLException;
public oracle.sql.StructDescriptor getDescriptor() 
throws java.sql.SQLException;
public String getSQLTypeName() 
throws java.sql.SQLException;
public void setAutoBuffering(boolean flag) 
throws java.sql.SQLException;
public boolean getAutoBuffering() 
throws java.sql.SQLException;

表5-10 OracleRef インタフェース

拡張

メソッド シグネチャ

OracleRef
拡張 java.sql.Ref


public String getBaseTypeName() 
throws SQLException;
public oracle.sql.StructDescriptor getDescriptor() 
throws SQLException;
public oracle.sql.STRUCT getSTRUCT() 
throws SQLException;
public Object getValue() 
throws SQLException;
public Object getValue(Map map) 
throws SQLException;
public void setValue(Object obj) 
throws SQLException;

表5-11 OracleThinBlob インタフェース

拡張

メソッド シグネチャ

OracleThinBlob
拡張 java.sql.Blob

int getBufferSize()throws java.sql.Exception
int getChunkSize()throws java.sql.Exception
int putBytes(long, int, byte[])throws java.sql.Exception
int getBinaryOutputStream()throws java.sql.Exception

表5-12 OracleThinClob インタフェース

拡張

メソッド シグネチャ

OracleThinClob
拡張 java.sql.Clob

public OutputStream getAsciiOutputStream()
throws java.sql.Exception;
public Writer getCharacterOutputStream()
throws java.sql.Exception;
public int getBufferSize() throws java.sql.Exception;
public int getChunkSize() throws java.sql.Exception;
public char[] getChars(long l, int i)
throws java.sql.Exception;
public int putChars(long start, char myChars[])
throws java.sql.Exception;
public int putString(long l, String s)
throws java.sql.Exception;

 

Back to Top Previous Next