• 検索結果がありません。

データ・ソース データ・ソース データ・ソース

データ・ソース データ・ソース データ・ソース

この章では、Oracle Application Server Containers for J2EE(OC4J)アプリケーションでの データ・ソースの構成方法と使用方法について説明します。データ・ソースは、データベー ス・サーバーへの接続をベンダーに依存しないでカプセル化したものです。データ・ソースは、

javax.sql.DataSourceインタフェースを実装するオブジェクトをインスタンス化します。

この章には、次の項目が含まれます。

概要

データ・ソースの定義

データ・ソースの使用方法

2フェーズ・コミットとデータ・ソースの使用

Oracle JDBCの拡張機能の使用方法

接続キャッシング・スキームの使用方法

OCI JDBCドライバの使用方法

DataDirect JDBCドライバの使用方法

データ・ソースの高可用性のサポート

概要 概要 概要 概要

データ・ソースは、javax.sql.DataSourceインタフェースを実装するJavaオブジェクトで す。データ・ソースは、JDBC接続を作成するための、ベンダーに依存しない移植可能なメ ソッドを提供します。データ・ソースは、データベースへのJDBC接続を戻すファクトリです。

J2EEアプリケーションは、JNDIを使用してDataSourceオブジェクトをルックアップしま

す。各JDBC 2.0ドライバは、JNDIネームスペースにバインド可能なDataSourceオブジェク

トの独自の実装を提供します。このデータ・ソース・オブジェクトがバインドされた後は、

JNDIルックアップによって取得できます。データ・ソースはベンダーに依存しないため、J2EE アプリケーションでは、データ・ソースを使用してデータ・サーバーへの接続を取得すること をお薦めします。

データ・ソースのタイプ データ・ソースのタイプ データ・ソースのタイプ データ・ソースのタイプ

OC4Jでは、データ・ソースが次のように分類されます。

エミュレートされたデータ・ソース

エミュレートされていないデータ・ソース

ネイティブ・データソース

表4-1に、データ・ソース・タイプ間の主な違いを示します。

表 表 表

4-1 エミュレートされたデータ・ソース、エミュレートされていないデータ・ソース、エミュレートされたデータ・ソース、エミュレートされていないデータ・ソース、エミュレートされたデータ・ソース、エミュレートされていないデータ・ソース、エミュレートされたデータ・ソース、エミュレートされていないデータ・ソース、

ネイティブ・データソースの特徴 ネイティブ・データソースの特徴ネイティブ・データソースの特徴 ネイティブ・データソースの特徴

エミュレートされている エミュレートされているエミュレートされている

エミュレートされている エミュレートされていないエミュレートされていないエミュレートされていないエミュレートされていない JTAなし ネイティブ・データソースネイティブ・データソースネイティブ・データソースネイティブ・データソース

ベンダーの拡張機能

ベンダーのJDBCプール/ キャッシュ

JTAなし

JTA エミュレートされたデータ・ソースエミュレートされたデータ・ソースエミュレートされたデータ・ソースエミュレートされたデータ・ソース

軽量トランザクション

1フェーズ・コミット

OC4Jプール/キャッシュ

エミュレートされていないデータ・ソース エミュレートされていないデータ・ソース エミュレートされていないデータ・ソース エミュレートされていないデータ・ソース

完全トランザクション

2フェーズ・コミット

Oracle JDBCプール/キャッシュ

注意注意

注意注意: ejb-locationによりエミュレートされていないデータ・ソースにア クセスする場合は、OC4Jのプールとキャッシュを使用します。

OracleConnectionCacheImplを使用すると、OC4JおよびOracle JDBC のプールとキャッシュの両方にアクセスできます。

概要

図4-1に、データ・ソースのタイプを選択する際に参考となる意志決定ツリーを示します。

図 図 図

4-1 データ・ソースのタイプの選択データ・ソースのタイプの選択データ・ソースのタイプの選択データ・ソースのタイプの選択

次の項では、各データ・ソース・タイプの詳細を説明します。

エミュレートされたデータ・ソース エミュレートされたデータ・ソース エミュレートされたデータ・ソース エミュレートされたデータ・ソース

エミュレートされたデータ・ソースとは、JTAトランザクション用にXAプロトコルをエミュ レートするデータ・ソースです。このタイプのデータ・ソースは、Oracleデータ・ソース用の OC4Jのキャッシュ、プーリングおよびOracle JDBCの拡張機能を提供します。従来は、JDBC ドライバにXA機能がなかったため、エミュレートされたデータ・ソースが必要でした。現在 は、ほとんどのJDBCドライバがXA機能を備えていますが、エミュレートされたXAが引き 続き優先される場合(2フェーズ・コミットを必要としないトランザクションなど)があります。

エミュレートされたデータ・ソースから取得した接続は、XAグローバル・トランザクション の完全なサポートを提供せずにXA APIをエミュレートするため、非常に高速になります。特 に、エミュレートされたデータ・ソースは、2フェーズ・コミットをサポートしません。ロー カル・トランザクションに対して、あるいはアプリケーションで2フェーズ・コミットを必要 としないグローバル・トランザクションを使用するときは、エミュレートされたデータ・ソー スの使用をお薦めします。2フェーズ・コミットの制限事項の詳細は、第7章「Java

Transaction API」を参照してください。

エミュレートされたデータ・ソースのdata-sources.xml構成エントリを次に示します。

<data-source

class="com.evermind.sql.DriverManagerDataSource"

name="OracleDS"

location="jdbc/OracleCoreDS"

xa-location="OracleDS"

ejb-location="jdbc/OracleDS"

connection-driver="oracle.jdbc.driver.OracleDriver"

username="scott"

password="tiger"

url="jdbc:oracle:thin:@//localhost:5521/oracle.regress.rdbms.dev.us.oracle.com"

inactivity-timeout="30"

/>

エミュレートされたデータ・ソースをdata-sources.xml内で定義するときには、

location、ejb-locationおよびxa-location属性の値を指定する必要があります。ただ し、エミュレートされたデータ・ソースをJNDI経由でルックアップするときには、

ejb-location属性で指定した値を使用します。次に例を示します。

Context ic = new InitialContext();

DataSource ds = (DataSource) ic.lookup("jdbc/OracleDS");

// This lookup could also be done as

// DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/OracleDS");

Connection con = ds.getConnection();

この接続によって、scott/tiger用のデータベース・セッションがオープンします。

エミュレートされたデータ・ソースをグローバル・トランザクション内で使用する場合は、注 意する必要があります。トランザクション・マネージャに登録するXAResourceはエミュレー トされたXAResourceであるため、トランザクションは実際には2フェーズ・コミット・トラ ンザクションになりません。グローバル・トランザクションに本当の2フェーズ・コミット・

セマンティクスが必要な場合は、エミュレートされていないデータ・ソースを使用する必要が あります。2フェーズ・コミットの制限事項の詳細は、第7章「Java Transaction API」を参照 してください。

単一のグローバル・トランザクション内で同じユーザー名とパスワードを使用して複数の接続 をデータ・ソースから取得すると、複数の論理接続は単一の物理接続を共有します。次のコー ドは、単一の物理接続を共有する2つの接続conn1とconn2を示しています。これらの接続 は、いずれも同じデータ・ソース・オブジェクトから取得されます。また、同じユーザー名と パスワードを使用して認証を行います。

Context ic = new InitialContext();

DataSource ds = (DataSource) ic.lookup("jdbc/OracleCMTDS1");

Connection conn1 = ds.getConnection("scott", "tiger");

Connection conn2 = ds.getConnection("scott", "tiger");

エミュレートされていないデータ・ソース エミュレートされていないデータ・ソース エミュレートされていないデータ・ソース エミュレートされていないデータ・ソース

エミュレートされていないデータ・ソースは、グローバル・トランザクションの2フェーズ・

コミット機能を含め、完全な(エミュレートされていない)JTAサービスを提供します。この タイプのデータ・ソースは、プーリング、キャッシュ、分散トランザクション機能およびベン ダーのJDBC拡張機能(現在はOracle JDBCの拡張機能のみ)を提供します。2フェーズ・コ ミットの制限事項の詳細は、第7章「Java Transaction API」を参照してください。

分散データベースの通信、リカバリおよび信頼性に関しては、エミュレートされていないデー タ・ソースの使用をお薦めします。エミュレートされていないデータ・ソースは、同じデータ ベースへの同一ユーザー用の論理接続に対して物理接続を共有します。

注意 注意 注意

注意: 以前のリリースでは、データ・ソース・オブジェクトの取得に location属性およびxa-location属性がサポートされていました。これ らの属性は現在廃止されています。アプリケーション、EJB、サーブレットお よびJSPでは、データ・ソースの取得に、エミュレートされたデータ・ソー ス定義でejb-locationのJNDI名のみを使用する必要があります。エミュ レートされたデータ・ソースの場合は3つの値をすべて指定する必要があり ますが、実際に使用されるのはejb-locationのみです。

注意 注意 注意

注意: エミュレートされていないデータ・ソースの実行には、Java対応デー タベースを使用する必要があります。エミュレートされていないデータ・

ソースと非Java対応データベースを使用している場合、MDBアプリケー

ション(AQJMS)をデプロイすると例外が生成され、OC4Jのstdoutにス

ローされます。エミュレートされたデータ・ソースまたはJava対応データ ベースに切り替えれば、デプロイは正しく行われます。

注意注意

注意注意: エミュレートされていないデータ・ソースを使用するアプリケーショ ンがアンデプロイされると、物理データベース接続は、OC4Jが再起動される まで、OC4Jから削除されません。