データ・ソース データ・ソース データ・ソース
この章では、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から削除されません。