ヘッダーをスキップ
Oracle Application Server WebSphereからの移行
10g リリース3(10.1.3.1.0)
B31845-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

6 JDBCアプリケーションの移行

この章では、Java Database Connectivity(JDBC)のAPIを紹介し、WebSphere Advanced Edition 3.5.3でのデータベースへの接続方法およびデータ・アクセス方法について説明します。また、WebSphereアプリケーションからOracle Containers for J2EE(OC4J)への移行方法についても説明します。この章の内容は次のとおりです。

6.1 JDBC API

JDBC APIによって、Javaプログラムでは、ベンダーに依存しない方法でリレーショナル・データにアクセスできるため、セッションの作成、SQL文の実行、およびリレーショナル・データベースからの結果の取得を行うことができます。JDBC仕様には、X/Open SQL call level interface仕様に基づいたJava用のSQL call level interfaceが含まれています。

JDBC APIは、JDBCドライバ、接続、文および結果セットの4つの主要コンポーネントで構成されています。データベース・ベンダーは、JDBC仕様に準拠したドライバのみを提供します。(詳細は、「データベース・ドライバ」を参照してください)。接続、文および結果セットのコンポーネントは、JDBC APIパッケージ(java.sqlパッケージ)に含まれています。

JDBC APIでは、これらのコンポーネントを操作するための次のインタフェース・クラスが提供されています。

JDBC 2.0 APIには、新しい標準拡張機能パッケージjavax.sqlのみでなく、java.sqlパッケージの多くの新機能が含まれています。java.sqlパッケージの機能には、SQL3データ型、スクロール可能な結果セット、プログラムによる更新およびバッチ更新のサポートなどがあります。

JDBCの新しい標準拡張機能APIは、Enterprise JavaBeans(EJB)テクノロジの不可欠な要素です。このAPIによって、接続プーリングを使用してファイルやスプレッドシートなどのほぼすべての表形式データソースに接続する分散トランザクションを記述できます。

JDBCアプリケーションを記述する場合、必要なドライバ固有の情報は、データベースURLのみです。JDBCアプリケーションは、実行時にURL情報を取得するように構築できます。アプリケーションは、データベースURL、ユーザー名およびパスワードを使用して、最初にDriverManagerからjava.sql.Connectionをリクエストします。

通常のJDBCプログラムは、次のプロセスで実行されます。

  1. ドライバのクラス名を使用してデータベース・ドライバをロードします。

  2. 接続用のJDBC URLを使用して接続を取得します。

  3. 文を作成および実行します。

  4. 結果セットを使用して結果を検索します。

  5. 接続をクローズします。

6.2 データベース・ドライバ

JDBCでは、指定したJDBCドライバへの標準APIコールが定義されます。JDBCドライバは、実際のデータ・インタフェース・コマンドを実行するソフトウェアです。このドライバは、低レベルのJDBC APIとみなされます。このドライバのインタフェースには、データベースのクライアント・コール、またはデータベース・サーバーによって提供されるデータベースのネットワーク・プロトコル・コマンドが使用されます。

JDBC APIコールを変換するJDBCドライバには、インタフェースのタイプに応じて、次の4つのタイプがあります。

6.2.1 DriverManagerクラス

Javaプログラムでは、様々なドライバを使用して、複数の異なるデータベースに対する複数の接続を作成できます。ドライバ操作を管理するために、JDBCには、java.sql.DriverManagerというドライバ・マネージャ・クラスが備えられています。このクラスによって、ドライバのロードおよび新しいデータベース接続の作成が行われます。

6.2.1.1 JDBCドライバの登録

DriverManagerによって、使用するすべてのJDBCドライバが登録されます。登録されていないドライバに対してJavaプログラムからJDBC操作が発行されると、No Suitable Driver例外が発生します。

ドライバを登録する場合は、次のいくつかの方法があります。

  • 次のコードを使用してドライバを明示的に登録する方法

    DriverManager.registerDriver(driver-instance)
    
    

    driver-instanceは、JDBCドライバ・クラスのインスタンスです。

  • 次のコードを使用してドライバ・クラスをロードする方法

    Class.forName(driver-class)
    
    

    driver-classは、JDBCドライバ・クラスです。これによって、Java仮想マシンにドライバがロードされます。各ドライバは、ロード後にDriverManager.registerDriverメソッドを使用して暗黙的に登録されます。

    たとえば、COM.ibm.db2.jdbc.appパッケージのDB2 JDBCタイプ2ドライバを登録する場合は、次のいずれかのコードを使用できます。

    DriverManager.registerDriver(new COM.ibm.db2.jdbc.app.DB2Driver());
    
    

    または

    Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
    
    

    Oracleデータベースの場合は、次のいずれかのコードを使用できます。

    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver ());
    
    

    または

    Class.forName("oracle.jdbc.driver.OracleDriver")
    
    

J2EEサーバーでは、JDBCドライバ構成に基づいてドライバが暗黙的にロードされるため、ドライバのロードにクライアント固有のコードは必要ありません。JNDI(Java Naming and Directory Interface)ツリーでデータソースのオブジェクトを参照できます。

WebSphere Advanced Edition 3.5.3では、DB2、Informix、Microsoft SQL Server、Oracle、Sybase、Versantおよびその他のデータベースをサポートしています。ただし、OracleのThick JDBCドライバはサポートしていません。OracleのThick JDBCドライバを使用するには、「データソースの構成」で説明しているように、データソースをOracle Containers for J2EE(OC4J)で構成します。OC4Jによって、サーバー起動時にドライバ・クラスが自動的にロードされます。


注意:

タイプ3のJDBCドライバ(COM.ibm.db2.jdbc.app.DB2Driver - jdcb:db2:DBNAME)を使用する場合は、DB2 Client Application Enabler(CAE)をインストールしてからリモート・データベースをカタログに追加する必要があります。OC4Jでは、カタログに追加したデータベースがローカル・データベースとして扱われます。

6.2.2 DataSourceクラス

JDBC 2.0仕様では、java.sql.Datasourceクラスが導入され、JDBCプログラムが完全に移植可能になりました。このバージョンでは、ベンダー固有の接続URLおよびマシンとポートへの依存性が解消されています。また、このバージョンでは、java.sql.DriverManagerDriver、およびDriverPropertyInfoの各クラスの使用は推奨されていません。以前のJDBC DriverManager機能は、データソース機能に完全に置き換えられています。ドライバ・マネージャ・クラスをクライアント・アプリケーションのランタイムに明示的にロードするのではなく、集中化されたJNDIサービス・ルックアップによってjava.sql.Datasourceオブジェクトが取得されます。Datasourceオブジェクトを使用してデータベースに接続することもできます。

データソースは、JDBC 2.0 API仕様に従って、JDBCサブコンテキストまたはその子コンテキストのいずれかの下に登録されます。JDBCコンテキスト自体は、ルート・コンテキストの下に登録されます。Datasourceオブジェクトは、データソースへのコネクション・ファクトリです。WebSphereとOC4Jは、どちらもJDBC 2.0 DataSource APIをサポートしています。

6.2.3 データソースの構成

WebSphereでデータソースを構成するには、Administrative Consoleを使用して、データソース名、データベース名およびJDBC URL文字列を指定します。この情報は、リポジトリ・データベースに格納されます。

OC4Jでは、フラット・ファイルを使用して、すべてのデプロイ済アプリケーションのデータソースが構成されます。データソースは、次のディスクリプタ・ファイルに指定されています。

UNIXの場合: <ORACLE_HOME>/j2ee/home/config/data-sources.xml

NTの場合: <ORACLE_HOME>\j2ee\home\config\data-sources.xml

次に、Oracleデータベースのデータソース構成の例を示します。data-sources.xmlの各データソース(xa-locationejb-locationおよびpooled-location)は、一意である必要があります。

<data-source
class="com.evermind.sql.DriverManagerDataSource"
name="Oracle"
url="jdbc:oracle:thin@node2058.oracle.com:1521:orcl"
xa-location="jdbc/xa/OracleXADS"
ejb-location="jdbc/OracleDS"
pooled-location="jdbc/OraclePoolDS"
connection-driver="oracle.jdbc.driver.OracleDriver"
username="scott"
password="tiger"
schema="database-schemas/oracle.xml"
inactivity-timeout="30"
max-connections="20"
/>

表6-1に、data-sources.xml内のすべての構成パラメータを示します。(前述の例に示されていないパラメータもあります)。

表6-1 data-sources.xmlファイル

パラメータ 説明

class

データソースのクラス名。

connection-driver

JDBCドライバのクラス名。

connection-retry- interval

失敗した接続を再試行するまでの待機時間(秒)。デフォルトは1秒です。

ejb-location

EJB対応のプーリングされたバージョンのデータベースをバインドするためのJNDIパス。このバージョンは、コンテナ管理のトランザクションで使用されます。このタイプのデータソースは、EJBおよび同様のオブジェクト内から使用されます。

このパラメータは、ConnectionDataSourceにのみ適用されます。

inactivity-timeout

使用されていない接続がクローズされるまでキャッシュされる時間(秒)。

location

データソースをバインドするためのJNDIパス。

max-connect-attempts

失敗した接続を再試行する回数。デフォルトは3回です。

max-connections

データソースをプーリングするためにオープンしておく接続の最大数。

min-connections

データソースをプーリングするためにオープンしておく接続の最小数。デフォルトは0(ゼロ)です。

name

データソースの表示名。

password

データソースにアクセスするためのユーザー・パスワード(オプション)。

pooled-location

プーリングされたバージョンのデータソースをバインドするためのJNDIパス。このパラメータは、ConnectionDataSourceにのみ適用されます。

schema

データベースに接続するためのdatabase-schemaファイルへの相対または絶対パス。

source-location

特殊なデータソースの基礎となるデータソース。

url

このデータソースのJDBC URL(java.sql.Connectionsを扱う一部のデータソースで使用します)。

username

データソースにアクセスするためのユーザー名(オプション)。

wait-timeout

すべての接続が使用されている場合に接続が解放されるまでの待機時間(秒)。デフォルトは60秒です。

xa-location

トランザクション・バージョンのデータソースをバインドするためのJNDIパス。このパラメータは、ConnectionDataSourceにのみ適用されます。

xa-source-location

特殊なデータソースの基礎となったXADataSourceOrionCMTDataSourceで使用します)。


WebSphereでは、サブコンテキストをサポートしていません。たとえば、xaがJDBCコンテキストの下のサブコンテキストである場合、xa/OracleXADSと指定することはできません。さらに、WebSphereでは、JDBCコンテキストが暗黙的に指定されるため、ユーザーが指定することはありません(data-sources.xmlで明示的に指定するOC4Jとは異なる)。ただし、WebSphereおよびOC4Jのどちらでも、データソースは自動的にバインドされます。

6.2.4 DB2データベースでのOC4Jの構成

DB2データベースを使用している場合、データソースとしてDB2を定義するには、次のディレクトリでdb2.xmlファイルを追加作成する必要があります。

UNIXの場合: <ORACLE_HOME>/OC4J/j2ee/home/config/database-schema

NTの場合: <ORACLE_HOME>\OC4J\j2ee\home\config\database-schema

db2.xmlスキーマ・ファイルの例を次に示します。

<?xml version="1.0"?>
<!DOCTYPE database-schema PUBLIC "-//Evermind//- Database schema"
"http://www.orionserver.com/dtds/database-schemas.dtd">
<database-scheme name="DB2" not-null="not null" null="default null"
  primary-key="primary key">
  <type-mapping type="java.lang.String" name="varchar(255)" />
  <type-mapping type="int" name="integer" />
  <type-mapping type="long" name="bigint" />
  <type-mapping type="float" name="double" />
  <type-mapping type="double" name="double" />
  <type-mapping type="byte" name="smallint" />
  <type-mapping type="char" name="smallint" />
  <type-mapping type="short" name="smallint" />
  <type-mapping type="boolean" name="char(1)" />
  <type-mapping type="java.util.Date" name="timestamp" />
  <type-mapping type="java.io.Serializable" name="blob(1 M)" />
  <disallowed-field name="add" />
  <disallowed-field name="admin" />
  <disallowed-field name="wvarchar" />
</database-scheme>

次の例では、対応するdata-sources.xmlファイルでdb2.xmlファイルを指定します。

<data-source
name="Default data-source"
class="com.evermind.sql.ConnectionDataSource"
location="jdbc/DefaultDS"
pooled-location="jdbc/DefaultPooledDS"
xa-location="jdbc/xa/DefaultXADS"
ejb-location="jdbc/DefaultEJBDS"
url="jdbc:db2:dbTest"
connection-driver="COM.ibm.db2.jdbc.app.DB2Driver"
username="myUserName"
password="myPwd"
inactivity-timeout="30"
schema="database-schemas/db2.xml"
/>

6.2.5 データソース・オブジェクトの取得

データソース・オブジェクトを取得する場合は、JNDI初期コンテキストのバインドおよびサブコンテキストjdbc/sampleDBの参照を行います。これらを行うには、初期コンテキストjavax.naming.InitialContextに対するハンドルを取得する必要があります。IntialContextは、JNDIネームスペースのルート・コンテキストです。InitialContextには、次の2つのコンストラクタがあります。

  • パラメータを取らないデフォルトのコンストラクタ

  • 1つのパラメータ(java.util.Propertiesまたはjava.util.HashTable)を取るコンストラクタ

OC4Jでは、パラメータを取るコンストラクタが使用されるようにコードを変更する必要があります。次に、コードの例を示します。

//WebSphere Code
try
{
  java.util.Properties parms = new java.util.Properties();   parms.setProperty(Context.INITIAL_CONTEXT_FACTORY,                                 "com.ibm.ejs.ns.jndi.CNInitialContextFactory");
  javax.naming.Context ctx = new javax.naming.InitialContext(parms);
  javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("jdbc/SampleDB");
  java.sql.Connection conn = ds.getConnection();

  // process the results
  ...
}

WebSphereから移行する際には、JNDIツリーの初期コンテキスト・ファクトリを実装するクラス(Context.INITIAL_CONTEXT_FACTORY)を変更する必要があります。

WebSphere固有の次のクラスを、

com.ibm.ejs.ns.jndi.CNInitialContextFactory

OC4J固有の次のクラスに変更します。

com.evermind.server.ApplicationClientInitialContextFactory

6.3 接続プーリング

ほとんどのWebベースのリソース(サーブレット、アプリケーション・サーバーなど)は、データベース内の情報にアクセスします。リソースは、データベースへのアクセスを試行するたびに、データベースへの接続を確立し、接続の作成および維持にシステム・リソースを使用する必要があります。また、接続が不要になった場合、その接続を解放するためにもシステム・リソースを使用する必要があります。リソースのオーバーヘッドは、Webベースのアプリケーションで特に大きくなります。これは、Webユーザーが頻繁かつ大量に接続および切断を行うためです。多くの場合、ビジネス・ロジックの実行で使用されるリソースより、接続および切断で使用されるリソースの量のほうが多くなります。

接続プーリングを使用すると、接続のオーバーヘッドを多数のユーザー・リクエストに分散することによって、接続リソースの使用を抑制できます。接続プールは、一連の接続オブジェクトをキャッシュしたもので、複数のクライアントがデータベースのリソースにアクセスする必要がある場合に、それらのクライアントによって共有されます。プール内に接続を作成するためのリソースは、指定した数の接続に対して1回のみ使用されます。各クライアント・クライアントによって専用の接続の作成およびクローズにリソースが使用されるのではなく、接続はオープン状態のまま維持され、多数のクライアント・リクエストによって繰り返し使用されます。接続プーリングでは、次の方法でパフォーマンス全体が向上されます。

JDBC 2.0仕様では、次の目的でJDBCデータベース接続のプールを定義できます。

これらの目的を実現するには、次の手順を実行します。

  1. 接続プールの最大サイズ・プロパティを、同時にアクティブとなるユーザー・リクエストの予想最大数と同じ値に設定します。

  2. 接続プールの最小サイズ・プロパティを、同時にアクティブとなるユーザー・リクエストの予想最小数と同じ値に設定します。

接続プーリングのプロパティによって、ユーザー・リクエスト数の減少に合わせて、未使用の接続がプールから段階的に削除されるようになります。同様に、ユーザー・リクエスト数の増加に合わせて、新しい接続が作成されます。接続の再利用が最大になり、接続作成のオーバーヘッドが最小になるように、接続のバランスが維持されます。また、接続プーリングを使用して、同時データベース接続の数を制御することもできます。

6.3.1 Oracle Application ServerへのWebSphereの接続プーリングの移行

WebSphere Advanced Edition 3.5.3では、データベース接続にアクセスするための2つのオプションが用意されています。

  • 接続プーリング(JDBC 2.0に基づいたモデル)

  • Connection Manager(JDBC 1.0に基づいたモデル)

6.3.1.1 WebSphereのJDBC 2.0の接続プーリングからの移行

WebSphereでは、次のパッケージを使用して、JDBC 2.0の接続プーリングとデータソース・オブジェクトを実装します。

import com.ibm.db2.jdbc.app.stdext.javax.sql.*;
import com.ibm.ejs.dbm.jdbcext.*;

WebSphereのJDBC 2.0接続からOC4Jに移行するには、これらのインポート・パッケージのかわりにjavax.sql.*を使用する必要があります。

同一のデータベース・マネージャに対して複数の接続を取得するアプリケーション・コンポーネントでは(使用したデータソースが1つまたは複数であるかに関係なく)、JTA対応のドライバを持つデータソースを使用する必要があります。詳細は、『Oracle Application Server Containers for J2EE ユーザーズ・ガイド』を参照してください。

6.4 IBMの拡張機能

WebSphereには、データ・アクセス用の次の拡張パッケージがあります。これらのパッケージを使用するアプリケーションでは、移行する前に、コード・レベルでの変更を行う必要があります。

6.4.1データ・アクセスBean

WebSphere Advanced Edition 3.5.3では、EJBのアクセスBeanに加えて、データ・アクセスBeanが用意されており、リレーショナル・データベースの問合せと結果セットを処理するための各種機能が備わっています。com.ibm.dbパッケージには、データ・アクセスJavaBeansクラスがあります。このクラスは、databeans.jarファイル内(アプリケーション・サーバーのルート・インストール・ディレクトリの下のlibディレクトリに入っている)にあります。データ・アクセスJavaBeansを使用してサーブレットをコンパイルするには、このJARファイルをクラスパスに含める必要があります。

OC4Jに移行する必要のあるデータ・アクセスBeanがコード内で多用されている場合は、databeans.jarファイルをOC4Jのクラスパスへ追加します。ただし、JDBC 2.0 APIへ移行することをお薦めします。

6.4.2 Connection Pool Manager

IBM WebSphere 3.5.xでは、前述のとおり、独自のConnection Pool Managerを使用した接続プーリングをいまだにサポートしています。そのため、IBM社のJDBC 2.0用の標準拡張機能を使用して接続プーリングを作成することをお薦めします。