Oracle Containers for J2EE サービス・ガイド 10g(10.1.3.1.0) B31858-01 |
|
この章では、Oracle Containers for J2EE(OC4J)のデータソースについて説明します。この章には、次の項目が含まれます。
この章では、次のOC4Jデータソース・タスクについて説明します。
次のOC4Jデータソースの機能および動作は、今回のリリースの新機能です。
次の項目は、今回のリリースで廃止予定です。
OracleConnectionCacheImpl
クラスは廃止予定です。このクラスでは、複数のスキーマはサポートされず、1人のユーザーのみがキャッシュされます。
stmt-cache-size
属性。データソースにJDBC文のキャッシング機能を構成するために、stmt-cache-size
属性ではなくnum-cached-statements
属性を使用してキャッシュ・サイズを設定します。
追加のデータソース情報は、次のドキュメントを参照してください。
データソースは、javax.sql.DataSource
インタフェースを実装するJavaオブジェクトです。データソースにより、ベンダーに依存しない移植可能なメソッドを使用して、データベースへの接続を作成できます。特定のデータベースを指定するために、データソース・オブジェクトのプロパティを設定します。アプリケーションでは、データソースのプロパティを変更することで様々なデータベースを使用できるため、アプリケーション・コードは変更せずに済みます。
OC4Jのデータソースには、マネージド・データソースとネイティブ・データソースという2つのタイプがあります。
マネージド・データソースは、OC4Jによって管理されます。つまり、グローバル・トランザクション管理、接続プーリング、エラー処理などの重要なシステム・インフラストラクチャは、OC4Jによって提供されます。マネージド・データソースは、JDBCドライバまたはデータソースのラッパーとして機能するjavax.sql.DataSource
インタフェースのOC4Jによる実装です。J2EEコンポーネントでは、データソース実装がラッパーであると認識することなく、JNDIを使用してマネージド・データソースにアクセスできます。
マネージド・データソースとネイティブ・データソースの相違点は、次のとおりです。
ネイティブ・データソースは、javax.sql.DataSource
インタフェースを実装しており、JDBCドライバ・ベンダー(オラクル社やDataDirect社など)により提供されます。ネイティブ・データソースとマネージド・データソースの相違点は、次のとおりです。
ネイティブ・データソースを構成する方法の詳細は、「ネイティブ・データソースの定義」を参照してください。
Application Server Controlコンソールは、データソースを管理するための主要ツールであり、データソースと接続プールの作成、データソースと接続プールの削除、既存のデータソースと接続プールの変更などの操作を実行できます。
データソースの設定に関する有益な情報は、Application Server Controlコンソールのオンライン・ヘルプを参照してください。
Application Server Controlコンソールでデータソースを変更すると、データソースの設定は、即座にそのアプリケーションのdata-sources.xml
ファイルに永続化されます。
デフォルト・アプリケーションのデータソース構成ファイルは、$J2EE_HOME/config/data-sources.xml
です。
このファイルの各<data-source>
タグは、JNDIにバインドされていてクライアント・コンポーネント(サーブレットやEJBなど)からアクセスできる1つのデータソースを示しています。
この項では、data-sources.xml
構成ファイルのデータソース定義の例を示します。
データソースを定義する方法の詳細は、「データソース・オブジェクトの構成」を参照してください。
data-sources.xml
ファイルの例は、「構成例」を参照してください。
data-sources.xml
ファイルで行った場合、その変更を実装するためにOC4Jを再起動する必要があります。
data-sources.xml
ファイルが生成され、コメントは失われます。
data-sources.xml
ファイルには、サンプルのデータソース・エントリおよび接続プール・エントリが含まれます。これらのエントリはサンプルとしてのみ使用され、削除できません。「サンプル・データソースの削除」を参照してください。
jndi-name
は、アプリケーションに対して一意である必要があります。同じdata-sources.xml
ファイルに重複するJNDI名を含めることはできません。JNDIロケーションがdata-sources.xml
ファイル内で重複していると、OC4Jによって例外がスローされます。グローバルなdata-sources.xml
ファイルですでに指定済のアプリケーションのdata-sources.xml
ファイルに、jndi-name
を指定することも可能です。この場合、そのアプリケーションのdata-sources.xml
に指定されたJNDIロケーションにより、アプリケーション・コンテキストのJNDIロケーションが上書きされます。
<data-source>
タグを使用します。class
属性には、javax.sql.DataSource
インタフェースを実装するオブジェクトのフルパスのクラス名を設定できます。
user
、password
、url
など)もこのタグで指定します。
<property>
タグで定義します。
<data-source>
タグの値を通じて設定します。
oracle.jdbc.pool.OracleDataSource
など)には、<data-source>
タグの<property>
サブタグを通じて設定可能なプロパティがあります。
<data-source>
タグで定義するプロパティ以外に、<property>
タグを使用して定義できるプロパティがあります。ユーザーは、Oracle以外のデータソース実装のプロパティを決定できます。
マネージド・データソースでは、接続を効率的に管理するため、接続プールを使用します。マネージド・データソースを作成する場合、少なくとも1つの接続プールと、そのコネクション・ファクトリを定義する必要があります。
OC4Jには、再利用可能な物理接続のキャッシュを保持することで効率性を高める接続プール機能があります。クライアントによって接続がクローズされると、その接続は、別のクライアントで使用できるようプールに戻されます。接続プールにより、複数のクライアントで少数の物理接続を共有できるため、パフォーマンスとスケーラビリティが向上します。
接続プールの性質および用途の詳細は、「マネージド・データソースでの接続プールの使用方法」を参照してください。
「OC4J: ホーム」→「管理」タブ→「タスク名: サービス」→「JDBCリソース」→「タスクに移動」→目的の設定にドリルダウン。
次の例で、Application Server Controlコンソールではなくdata-sources.xml
ファイルで接続プールを定義する方法を示します。
<connection-pool name="myConnectionPool"> <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com"/> <property name="foo" value="bar"/> </connection-factory> </connection-pool>
<connection-pool>
要素には、接続プールを一意に識別するname
属性が含まれます。他の属性では、接続プールで保持する接続の最大数など、接続プールのパラメータを定義します。接続プールは、<connection-factory>
要素で定義されたコネクション・ファクトリを使用してデータベースから物理接続を取得します。
<connection-factory>
要素には、JDBCドライバがデータベースに接続するためのURLと、データベースから接続を取得するためのオプションのデフォルト・ユーザーおよびパスワードが含まれます。factory-class
属性では、接続を取得するJDBCドライバにより提供される実装クラスを定義します。実装クラスは、次のいずれかのインタフェースを実装する必要があります。
接続プールおよびコネクション・ファクトリ設定の詳細は、表5-3「接続プールの属性」を参照してください。
1つ以上の接続プールを定義したら、マネージド・データソースを定義できます。
マネージド・データソース設定へのパス
「OC4J: ホーム」→「管理」タブ→「タスク名: サービス」→「JDBCリソース」→「タスクに移動」→「データソース」→「作成」→「アプリケーションの選択」→「データソース・タイプの選択」→「マネージド」
次の例で、前に定義した接続プールを使用して、data-sources.xml
ファイルでマネージド・データソースを定義する方法を示します。
<managed-data-source jndi-name="jdbc/ManagedDS" name="Managed DataSource Name" connection-pool-name="myConnectionPool" />
name
属性では、一意のマネージド・データソースを指定します。jndi-name
属性では、このデータソースを配置するJNDIロケーションを定義します。connection-pool-name
属性では、このマネージド・データソースが接続を取得するために通信する接続プールを指定します。この接続プール名は、前項の「接続プールの定義」の例に記載されている<connection-pool>
要素のname
属性の値に対応します。
ネイティブ・データソースは、接続プールに依存しません。そのため、ネイティブ・データソースの定義には、基礎となるデータベースと通信するのに必要なデータが含まれます。
ネイティブ・データソース設定へのパス
「OC4J: ホーム」→「管理」タブ→「タスク名: サービス」→「JDBCリソース」→「タスクに移動」→「データソース」→「作成」→「アプリケーションの選択」→「データソース・タイプの選択」→「ネイティブ」
次の例で、data-sources.xml
ファイルでネイティブ・データソースを定義する方法を示します。
<native-data-source name="nativeDataSource" jndi-name="jdbc/nativeDS" data-source-class="com.acme.DataSourceImpl" user="frank" password="frankpw" url="jdbc:acme:@localhost:5500:acme" />
データソース構成の追加の例は、http://www.oracle.com/technology/tech/java/newsletter/articles/oc4j_datasource_config.htmlにある資料「Data Source Configuration in Oracle Application Server 10g」を参照してください。
name
属性では、一意のネイティブ・データソースを指定します。jndi-name
属性では、このデータソースを配置するJNDIロケーションを定義します。data-source-class
属性では、ネイティブ・データソースの実装クラスを定義します。このクラスは、javax.sql.DataSource
を実装している必要があります。user
およびpassword
属性では、デフォルトのユーザーとパスワードを定義します。url
属性では、データソースがデータベースと通信するためのURLを定義します。
data-sources.xml
で定義したデータソースごとに、そのデータソースの通信対象であるバックエンド・データベースにアクセスできないことを示す致命的エラー・コードを定義できます。OC4Jでこれらのエラー・コードのいずれかが検出されると(JDBCドライバによってSQLExceptionがスローされた場合)、その接続プールは削除されます。つまり、接続プールのすべての接続がクローズされます。Oracleで事前定義されている致命的エラー・コードは、3113
、3114
、1033
、1034
、1089
および1090
です。
Oracle以外のデータベースに致命的エラー・コードを定義する場合や、Oracleデータベースに別の致命的エラー・コードを追加する場合は、次の手順を使用します。
<connection-factory>
要素のサブタグである<fatal-error-codes>
要素を使用します。<fatal-error-codes>
要素で、子要素の<error-code>
を使用して1個の致命的エラー・コードを定義します。1つの<fatal-error-codes>
要素に対して、0〜n個の<error-code>
要素を定義できます。たとえば、致命的エラー・コードとして10
、20
、30
を設定する場合、データソース定義は次のようになります。
<connection-pool name="myConnectionPool"> <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com"> <fatal-error-codes> <error-code code='10'/> <error-code code='20'/> <error-code code='30'/> </fatal-error-codes> </connection-factory> </connection-pool>
data-sources.xml
ファイルには、認証用のパスワードが必要です。これらのパスワードをなんらかの形式で不明瞭化することなく埋め込むと、セキュリティ上のリスクが生じます。この問題を回避するため、OC4Jでは、パスワードの間接化をサポートしています。
間接パスワードは、特殊な間接化記号(->
)とユーザー名(またはユーザー名とレルム)で構成されます。OC4Jは、間接パスワードを検出すると、ユーザー・マネージャが提供するセキュリティ・ストアから、指定のユーザーに関連付けられているパスワードを取得します。
ユーザーとパスワードの作成およびユーザー・マネージャの操作の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』のパスワード管理に関する項を参照してください。
たとえば、次のようなネイティブ・データソースのエントリがあるとします。
<native-data-source name="nativeDataSource" jndi-name="jdbc/nativeDS" data-source-class="com.acme.DataSourceImpl" user="frank" password="frankpw" url="jdbc:acme:@localhost:5500:acme" />
この場合、パスワードfrankpw
は、間接化記号(->
)とユーザー名(frank
)を使用して、password="->frank"
のように置き換えることができます。この操作は、ユーザー名frank
とそのパスワードfrankpw
がユーザー・マネージャに作成されていることを前提とします。
パスワードの間接化は、Application Server Controlコンソールで構成できます。
データソースの間接パスワードをdata-sources.xml
ファイルに直接構成するには、password
属性の値を->で始め、続けてユーザー名(またはスラッシュ(/)で区切ったレルムとユーザー名)を指定します。次に例を示します。
<native-data-source name="nativeDataSource" jndi-name="jdbc/nativeDS" data-source-class="com.acme.DataSourceImpl" user="frank" password="->frank" url="jdbc:acme:@localhost:5500:acme" />
<managed-data-source>
および<connection-factory>
要素には、password
属性もあります。
data-sources.xml
ファイルには、サンプルの接続プール、およびデフォルトのデータソースとして使用されるマネージド・データソースのエントリが含まれます。これらの例は説明を目的として使用され、データソースを理解するために用意されています。
接続プールおよびデータソースの削除は、Application Server Controlコンソール(「OC4J: ホーム」→「管理」タブ→「タスク名: サービス」→「JDBCリソース: タスクに移動」)を使用するか、data-sources.xml
ファイルから手動でエントリを削除することで実行できます。コンソールを使用する場合は、データソースを削除してから接続プールを削除します。
サンプルのデータソースを削除したら、default-data-source
属性を使用して、新しいデフォルトのデータソースをJ2EE_HOME/application.xml
ファイルに割り当てます。実行時に適切なデータソース構成が検出されない場合、このOC4Jインスタンスにデプロイされたすべてのアプリケーションは、デフォルトでこのデータソースに設定されます。ただし、OC4Jインスタンスを実行するためにはデフォルトのデータソースは不要です。
OC4Jのデータソースは、次の2つのタイプの接続を戻します。
データソースでは、データベースと通信することで接続を生成します。通常、データソースでは、データベースとの通信に使用するマシン、ポート、データベース名などの識別にURLを使用します。
マネージド・データソースのURLは、そのマネージド・データソースの接続プールのコネクション・ファクトリで定義します。コネクション・ファクトリのurl
属性により、データベースとの通信に使用するURLを定義します。JDBCドライバでは、URLの書式を定義しています。このドキュメント全体を通じて、いくつかのURLの例が記載されています。
ネイティブ・データソースのURLは、<native-data-source>
要素のurl
属性で定義します。
基本的なデータソース実装では、クライアントの接続オブジェクトと物理接続の間に1対1の対応関係があります。通常、クライアントが接続をクローズすると、物理接続は削除されます。この場合、クライアントがデータソースから接続を取得するたびに、多くのオーバーヘッドが生じます。
OC4Jのマネージド・データソースでは、接続プールを頻繁に使用します。
接続プールは、複数のマネージド・データソースによって使用できます。つまり、複数のマネージド・データソースで同じ接続プールを共有できます。
Oracle10g JDBCドライバを使用するようデータソースを定義すると、OC4Jでは、このドライバに付属するImplicit Connection Cache(ICC)により提供される高機能な接続プールが使用されます。OC4Jデータソースでは、自動的にICCが使用されます。ICCを無効化する方法は、「ICCの無効化」を参照してください。特に指定のないかぎり、表5-3「接続プールの属性」に記載されたすべての接続プール属性がICCに適用されます。一部の属性は、Implicit Connection Cache対応のデータソース(OracleDataSource
およびOracleXADataSource
)にのみ適用されます。ICCを使用するために追加の構成を実行する必要はありません。
接続プールの構成設定の詳細は、表5-3「接続プールの属性」を参照してください。
接続プールは、Oracle以外のJDBCドライバや旧リリースのOracle JDBCドライバでも使用できます。接続プール構成の例は、「構成例」を参照してください。
マネージド・データソースを使用する場合、接続プールから取得される各接続は、OC4Jによりプロキシ・オブジェクトでラップされます。このプロキシにより、OC4Jでは、トランザクション登録、例外処理およびロギングが可能になります。
クライアントでは、java.sql
インタフェースのベンダー実装により提供される拡張インタフェースも使用できます。たとえば、java.sql.Connection
インタフェースのOracle拡張は、oracle.jdbc.OracleConnection
です。このインタフェースにより、java.sql.Connection
インタフェースには含まれないOracle固有のAPIが提供されます。OC4Jには、プロキシが実装するインタフェースを制限するための構成要素があり、クライアントのアクセス先をこれらのAPIに限定できます。この構成要素は、任意のjava.sql.*
インタフェースの追加インタフェースを指定するために使用できます。デフォルトでは、プロキシは、基礎となるオブジェクトにより実装されている任意のpublicインタフェースを実装します。
プロキシの設定方法の詳細は、表5-3「接続プールの属性」を参照してください。
次の例で、Application Server Controlコンソールではなくdata-sources.xml
ファイルで接続プールの接続プロキシと文プロキシを定義する方法を示します。
<connection-pool name="myConnectionPool"> <connection-factory factory-class="com.acme.AcmeDataSource" user="scott" password="tiger" url="jdbc:acme:@localhost:1234:acme"> <property name="foo" value="bar"/> <proxy-interface sql-object="Connection" interface="com.acme.AcmeConnection"/> <proxy-interface sql-object="CallableStatement" interface="com.acme.AcmeCallableStatement"/> </connection-factory> </connection-pool>
この例において、Connectionオブジェクト用に生成されるプロキシは、基礎となる接続オブジェクトによって実装されるインタフェースにかかわらず、com.acme.AcmeConnection
インタフェースのみを公開します。同様に、Statementオブジェクト用に生成されるプロキシは、com.acme.AcmeStatement
インタフェースのみを公開します。データソースのデプロイヤは、この方法により、プロキシ・オブジェクトによって公開されるインタフェースを制限できます。
この項では、データソースから接続を取得して文を実行するためのサンプル・コードを示します。
Connection connection = null; try { InitialContext context = new InitialContext(); DataSource ds = (DataSource) context.lookup( "jdbc/ManagedDS" ); connection = ds.getConnection(); Statement statement = connection.createStatement(); statement.execute( "select * from dual" ); statement.close(); } catch( Exception exception ) { // process exception } finally { if ( connection != null ) { try { connection.close(); } catch( SQLException sqlException ){} } }
注意
ユーザーとパスワードを渡さずに コネクション・ファクトリでユーザーとパスワードを指定する方法は、表5-4「コネクション・ファクトリの属性」を参照してください。 コネクション・ファクトリのプロパティの詳細は、「コネクション・ファクトリのプロパティ」を参照してください。 |
一定の状況下では、データソースにより接続を戻すことができない場合があります。この最も一般的な原因は、接続プールのすべての接続が使用中であることです。データソースを一定時間待機させた後に接続プールをチェックして、接続を戻す前に使用可能な接続があるかどうかを確認できます。
接続プールの構成設定には、プールの接続が使用できない場合の待機時間を制御する設定と、接続プールに接続が存在するかどうかを問い合せる試行の回数を制御する設定の2つがあります。
max-connect-attempts
設定では、(接続プールのすべての接続が使用中の場合に)マネージド・データソースで接続プールから接続を取得する操作を再試行する回数を定義します。connection-retry-interval
設定では、接続プールからの接続の取得に最後に失敗した後、次の取得操作を再試行するまでに待機する間隔を秒単位で指定します。これらの設定の詳細は、表5-3「接続プールの属性」を参照してください。
次の例で、Application Server Controlコンソールではなくdata-sources.xml
で再試行を構成する方法を示します。この例では、max-connect-attempts
を5
回に、connection-retry-interval
を3
秒に設定します。
<connection-pool name="myConnectionPool" max-connect-attempts="5" connection-retry-interval="3"> <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com"/> </connection-pool>
OC4Jでは、Oracle JDBCネイティブ・データソースを使用したプロキシ認証がサポートされています。Oracleデータベースではプロキシ認証がサポートされています。プロキシ認証を使用すると、クライアント・ユーザーはアプリケーション・サーバーを介して、プロキシ・ユーザーとしてデータベースに接続できます。アプリケーション・サーバーはOracleデータベースを使用して、プロキシ・ユーザーとして自身を認証しますが、クライアント・ユーザーは、アプリケーション・サーバーを使用して自身を認証します。この方法で確立されたプロキシ接続では、データベースに接続するまで同じクライアント・ユーザー名が使用されます。
Oracle JDBCネイティブ・データソースを使用したプロキシ認証の構成および使用方法の主要な手順を説明し、構成済のOracleデータベースへのプロキシ接続をJSPコードでテストするデモが公開されています。デモの文書とソース・コードは次のサイトで公開されています。
http://www.oracle.com/technology/tech/java/oc4j/1013/how_to/index.html
現在、OC4Jの観点からすると、中間層ではグローバル・トランザクションのコンテキストでプロキシ・セッションをサポートすることはできません。主な問題は、プロキシ・セッションが既存のJDBC接続ハンドル上に確立され、この接続ハンドルの基礎となる状態の変更が中間層のトランザクション・マネージャに認識されないことです。そのため、OC4Jトランザクション・マネージャでプロキシ・セッションと通常のセッションを区別することができません。プロキシ・セッションの作成時に既存のJDBC接続ハンドルが再利用されるため、トランザクション・マネージャがトランザクションの関連付けを終了するようリソース・マネージャに通知するまで、中間層では接続ハンドルでの処理は既存のグローバル・トランザクションの一部であるとみなされます。
OC4Jの旧リリースでは、JDBCプロキシ・セッションの実装がサポートされるかどうかは、2セッションのモデルに依存していました。このモデルでは、まず信頼できるユーザー(通常はアプリケーション)セッションが確立され、その後、プロキシ処理が発生するとターゲット・ユーザーのその他のセッションが確立されます。どちらのセッションもデータベースに保持されます。このデータベースでは、信頼できるユーザー・セッションはプロキシ・セッションがアクティブなかぎり一時停止されます。このモデルは、単一インスタンスのデータベースへの接続や、複数のターゲット・ユーザーとしてのプロキシをアプリケーションで保持する必要がある場合に適しています。ただし、いくつかのデメリットがあります。
JDBC/OC4Jでは、プロキシ・セッションの作成を可能にする、ConnectionのopenProxySession APIが公開されています。このJDBC APIが既存の信頼できるユーザー接続/セッションで起動されると、バックエンドで2つ目のプロキシ・セッションが作成され、その信頼できるユーザーのセッションが一時停止されます。中間層のサブシステムの多くで大規模な変更が必要なため、OC4J/TMでXAおよび2セッション・アーキテクチャのプロキシ・セッションをサポートすることはできません。これらの変更は間違いやすく、リスクも伴います。
InitialContext ic = new InitialContext(); DataSource nativeDS = (DataSource) ic.lookup(NATIVE_DS_NAME); OracleConnection oconn = (OracleConnection) nativeDS.getConnection(PROXY_USER_NAME, PROXY_USER_PWD); strBuf.append("Obtained a connection using getConnection(" + PROXY_USER_NAME + ", " + PROXY_USER_PWD + ")\n"); strBuf.append("isProxySession: " + oconn.isProxySession() + "\n"); strBuf.append("Check user name before opening the proxy session\n"); strBuf.append(checkUser(oconn)); // Specify the user that connects through the proxy user and its roles Properties prop = new Properties(); prop.put(OracleConnection.PROXY_USER_NAME, USER_NAME); prop.put(OracleConnection.PROXY_ROLES, roles); // Open the proxy session (DB-authenticated users) oconn.openProxySession(OracleConnection.PROXYTYPE_USER_NAME, prop); strBuf.append("Opened a proxy session for " + USER_NAME + " through " + PROXY_USER_NAME + " using openProxySession()\n"); strBuf.append("isProxySession: " + oconn.isProxySession() + "\n"); // Now test using the proxy-connection strBuf.append("### Testings using the proxy session ###\n"); String resultStr = testAndGetResultString(oconn); strBuf.append(resultStr); strBuf.append("Closing the proxy session ...\n"); oconn.close(OracleConnection.PROXY_SESSION); strBuf.append("isProxySession: " + oconn.isProxySession() + "\n"); strBuf.append("Check user name after closing the proxy session\n"); strBuf.append(checkUser(oconn)); strBuf.append("Closing the original connection ...\n"); oconn.close();
マネージド・データソースには、文の操作をより効率的に実行するためのキャッシング機能とプロキシ機能があります。
文キャッシュにより、繰り返し使用される実行可能文がキャッシュされるため、パフォーマンスが向上します。また、プログラマは、プリコンパイルされた文を明示的に再利用する必要がなくなります。文キャッシュを使用することで、カーソル作成の繰返しや文の解析と作成の繰返しに起因するオーバーヘッドを排除できると同時に、アプリケーション・サーバーとデータベース・サーバー間の通信により発生するオーバーヘッドも削減できます。文キャッシュの特徴は、次のとおりです。
カーソル作成の繰返しや文の解析と作成の繰返しによるオーバーヘッドを削減するため、データベース文で文キャッシュを使用できます。JDBC文のキャッシング機能を有効化して繰り返し使用される実行可能文をキャッシュするには、文キャッシュを使用するようデータソースを構成します。JDBC文のキャッシュは、データソースで管理されている特定の物理接続と関連付けられます。文キャッシュは、データソースに関連付けられていないため、すべての物理接続で共有することはできません。JDBC文のキャッシュは、データベース・サーバーではなく中間層で管理されます。
文キャッシュの有効化と無効化をプログラムで動的に切り替えるには、接続オブジェクトのsetStmtCacheSize()
メソッドを使用します。
データソースでJDBC文のキャッシング機能を構成するには、num-cached-statements
属性を使用してキャッシュのサイズを設定します。この属性では、キャッシュに配置する文の最大数を設定します。num-cached-statements
属性を指定しないか、0
に設定した場合、文キャッシュは無効化されます。
次のXMLでは、文のキャッシュ・サイズを200文に設定します。
<data-source> ... num-cached-statements="200" </data-source>
num-cached-statements
属性を設定するには、まずアプリケーションがデータベースに発行する個別の文の数を決定します。次に、キャッシュのサイズをその数に設定します。アプリケーションがデータベースに発行する文の数がわからない場合は、JDBCのパフォーマンス・メトリックを使用すると文のキャッシュ・サイズの決定に役立ちます。文メトリックを使用するには、OC4JでJavaプロパティのoracle.jdbc.DMSStatementMetrics
をtrue
に設定する必要があります。
データソースにnum-cached-statements
を指定しても、文はデータソースや接続プールごとにではなく、接続ごとにキャッシュされます。つまり、特定のデータソースのnum-cached-statements
が0
より大きい場合、そのデータソースから取得されたマネージド接続ごとに独自の文キャッシュが保持されます。
接続の文キャッシュに保持されている文は、データベース・リソースを解放しない可能性があることに注意してください。オープンしている接続の数と、接続ごとにキャッシュされている文の数の合計が、データベースに許可されたオープン・カーソルの制限を超える可能性があります。num-cached-statements
の値を減らすか、データベースに許可されたオープン・カーソルの制限を増やすことで、この問題を回避できる場合があります。
java.sql.*
インタフェース(マネージド・データソース)のすべての実装は、OC4Jによりプロキシ・オブジェクトでラップされます。これには、文オブジェクト(java.sql.Statement
、java.sql.PreparedStatement
およびjava.sql.CallableStatement
)も含まれます。
プロキシの設定方法の詳細は、表5-3「接続プールの属性」に記載されているコネクション・ファクトリの「プロキシ・インタフェース」タブの説明を参照してください。
一定の状況下では、接続プロキシが新しい物理接続にリバインドされる場合があります。これは、接続プロキシが1つのトランザクション全体で使用される場合などに発生します。リバインドが発生すると、接続プロキシを通じて取得された文オブジェクトは、古い物理接続を使用して作成されているため、すべて無効になります。このため、物理接続から取得される文オブジェクトに対しても、プロキシが配置されます。これらの文プロキシは、基礎となる物理接続との関連を監視できるように、取得元の接続プロキシと関連付けられます。文プロキシにより、接続プロキシに関連付けられた物理接続が変化したと判断されると、接続プロキシから新しい物理文が取得されます。
java.sql.Statement
、java.sql.PreparedStatement
およびjava.sql.CallableStatement
インタフェースのベンダー固有の拡張も、接続と同じ方法によりクライアントで使用できます。
J2EEでは、次の2種類のトランザクションがサポートされます。
ローカル・トランザクションとグローバル・トランザクションを含むトランザクション・サポートの詳細は、第5章「データソース」を参照してください。
ローカル・トランザクション用に構成されたマネージド・データソースは、ローカル・トランザクションに参加できるがグローバル・トランザクションには参加できない接続を戻します。つまり、その接続は、グローバル・トランザクションに登録されません。データソースは、取得した接続の自動コミットをtrueに設定します。ただし、ローカル・トランザクションでその接続をどのように使用するかを決定するのは、クライアントです。クライアントは、接続に対してsetAutoCommit()
を使用することで、自動コミット・モードを変更できます。
マネージド・データソースをローカル・トランザクション用に設定する方法は、表5-1「マネージド・データソースの設定」に記載されている「トランザクション・レベル」の設定を参照してください。
Application Server Controlコンソールではなくdata-sources.xml
ファイルでデータソースをローカル・トランザクション用に構成するには、tx-level
属性をlocal
に設定します(デフォルト値はglobal
です)。次に例を示します。
<managed-data-source jndi-name="jdbc/ManagedDS" name="Managed DataSource Name" connection-pool-name="myConnectionPool" tx-level="local" />
ネイティブ・データソースは、ローカル・トランザクションにのみ参加できるため、ネイティブ・データソース用のトランザクション・サポートの設定はありません。
local
としてマーク付けされた接続を、グローバル・トランザクションの内部で使用することも可能です。このケースは、JDBC仕様で具体的に言及されているわけではありませんが、仕様には、接続が分散トランザクションに参加しない場合、その接続はローカル接続のように振る舞うという意味の記載があります。接続がグローバル・トランザクションに登録されない場合、その接続はグローバル・トランザクションに参加しません。したがって、local transaction
で構成されたデータソースにより生成される接続は、たとえグローバル・トランザクションの内部でその作業が実行される場合でも、ローカル・トランザクションの内部に存在するかのように扱われます。つまり、自動コミットがfalse
に設定されている場合、このような接続で実行される作業は、その接続でcommitやrollbackがコールされるまでコミットまたはロールバックされません。この動作は、分散トランザクションでコミットまたはロールバックが実行される場合でも同様です。このケースでは、接続は、構文的にトランザクション境界を伴って出現するだけで、意味的にはそのトランザクションに参加しません(つまり、この接続は登録されません)。
lc
を取得します。
gc
を取得します。
lc
上で処理される作業は、その作業が実行されるか(自動コミットがtrue
の場合)、lc
上でcommitやrollbackがコールされると(自動コミットがfalse
の場合)コミットされます。
gc
上の作業は、この時点でコミットまたはロールバックされます。lc
上の作業は、コミットされません。
lc
上の作業は、その接続でcommit
またはrollback
をコールすることでコミットまたはロールバックできます(自動コミットがfalse
に設定されている場合)。
次のコード例では、前述の手順を実装します。
Connection lc = localTxDataSource.getConnection(); userTransaction.begin(); Connection gc = globalTxDataSource.getConnection(); lc.doWork(); gc.doWork(); userTransaction.commit(); // At this point work done on gc is now committed. //The work done on lc is NOT yet committed. lc.commit(); // At this point work done on lc is now committed.
通常、ローカル・トランザクションは、クライアントが接続上でautoCommit
をfalse
に設定すると開始し、クライアントが同じ接続上でcommit()
またはrollback()
をコールすると終了します。autoCommit
がfalse
で、トランザクション作業が実行されていない場合、接続で明示的にcommit()
またはrollback()
をコールする必要はありません(トランザクション作業が実行されていないためにコミットやロールバックが不要であることは、ドライバにより正しく認識されます)。
OC4Jは、autoCommit
がfalse
であり、かつcommit()
、rollback()
、setAutoCommit(true)
またはclose()
以外の任意のメソッドが接続上でコールされると、アクティブなローカル・トランザクションがその接続に存在すると判断します(ただし、OC4Jは、接続上で処理される作業が実際にトランザクション形式の作業であるかどうかは判断できません)。commit()
やrollback()
のコール、またはautoCommit
の値の変更が発生すると、現在のローカル・トランザクションは終了します。autoCommit
がfalse
であり、かつcommit()
、rollback()
、setAutoCommit(true)
またはclose
以外のメソッドが引き続き接続上でコールされると、OC4Jは、それを新しいローカル・トランザクションの開始と判断します。
クライアントが接続で(commit()
、rollback()
またはsetAutoCommit(true)
をコールして)明示的にローカル・トランザクションを終了しない場合については、次の2つのケースを検討する必要があります。
OC4Jでは、次の2つの方法でこれらのケースを処理できます。
commit()
またはrollback()
をコールして暗黙的にローカル・トランザクションを終了します。また、OC4Jでは、接続がクローズされるか、グローバル・トランザクションで使用される場合に例外をスローできます。
グローバル・トランザクション用に構成されたマネージド・データソースは、グローバル・トランザクションに参加できる接続を戻します。グローバル・トランザクション(分散トランザクション)では、トランザクションに複数のリソースが登録されます。
未処理のJ2CAローカル・トランザクションが存在する場合に、トランザクション・マネージャでグローバル・トランザクションを処理する方法の詳細は、「ローカル・トランザクション管理」を参照してください。
トランザクションの詳細は、第3章「OC4Jトランザクション・サポート」を参照してください。
マネージド・データソースをグローバル・トランザクション用に設定する方法は、表5-1「マネージド・データソースの設定」に記載されている「トランザクション・レベル」の設定を参照してください。
Application Server Controlコンソールではなくdata-sources.xml
ファイルでデータソースをグローバル・トランザクション用に構成するには、tx-level
属性(デフォルト値はglobal
)を含めないか、tx-level
属性をglobal
に設定します。次に例を示します。
<managed-data-source jndi-name="jdbc/ManagedDS" name="Managed DataSource Name" connection-pool-name="myConnectionPool" tx-level="global" />
グローバル・トランザクションが失敗した場合、トランザクション・マネージャでXAリカバリを実行する必要があります。この場合、リカバリするリソースごとにいくつかの情報を定義しておく必要があります。データソースでは、factory-classにjavax.sql.XADataSource
を使用するコネクション・ファクトリごとに、リカバリ用のusername
とpassword
を定義します。
表5-3「接続プールの属性」に記載されている「ユーザー」および「パスワード」の設定を参照してください。
次の例で、Application Server Controlコンソールではなくdata-sources.xml
ファイルでXAリカバリを構成する方法を示します。xa-recovery-config
ノードに注意してください。
<connection-pool name="myConnectionPool"> <connection-factory factory-class="oracle.jdbc.xa.client.OracleXADataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com"> <xa-recovery-config> <password-credential> <username>system</username> <password>manager</password> </password-credential> </xa-recovery-config> </connection-factory> </connection-pool>
注意
|
エミュレートされたXAResourceは、XAプロトコルのセマンティックをエミュレートするjavax.sql.XAResource
の実装です。グローバル・トランザクション中、エミュレートされたXAResourceに関連付けられた接続は、グローバル作業ユニットのサブセットとして明示的に制御されるトランザクション・ブランチではなく、ローカル・トランザクションを使用してXAのセマンティックに準拠します。
javax.sql.XADataSource
の実装を提供しないJDBCドライバをサポートする場合は、XAResourceをエミュレートする必要があります。エミュレートされたXAResourceは、実際の2フェーズ・コミットに関連するオーバーヘッドによるパフォーマンス上の影響を受けないため、本物のXAResourceより高速に動作します。
エミュレートされたXAResourceを使用する場合、複数のXAResourceを登録し、少なくともその1つをエミュレートすると、一貫性のない状態やリカバリ不可能な状態が発生することがあります。エミュレートされたXAResourceは、準備フェーズ中にローカル・トランザクションを使用するため、正しい準備を実行できないのがその理由です。これが問題となる1つの例としては、エミュレートされたXAResourceでcommitがコールされたときに、そのローカル・トランザクションがすでにタイムアウトしており、結果としてローカル・トランザクションのコミットに失敗し、トランザクション全体が一貫性のない状態に陥ることがあります。
OC4Jでは、XA動作をエミュレートする状況が自動的に判別されます。これは、コネクション・ファクトリのfactory-classオブジェクトを内部監視することで実行されます(factory-class
属性では、接続プール用の接続を作成するためのコネクション・ファクトリで使用するオブジェクトを指定します)。このオブジェクトがjavax.sql.XADataSource
のインスタンスであれば、XAはエミュレートされません。このオブジェクトがjava.sql.Driver
、javax.sql.DataSource
またはjavax.sql.ConnectionPoolDataSource
のインスタンスである場合、このデータソースでXA動作がエミュレートされます。
この項では、Application Server Controlコンソールで設定するか、data-sources.xml
ファイルで直接設定するかを問わず、様々なデータソース関連オブジェクトの構成設定とその説明を示します。
各設定は、次の表に記載されています。
データソース・オブジェクトを構成する方法の詳細は、「データソースの定義」を参照してください。
マネージド・データソースを定義するには、1つ以上の接続プールを定義する必要があります。
マネージド・データソース設定へのパス
「OC4J: ホーム」→「管理」タブ→「タスク名: サービス」→「JDBCリソース」→「タスクに移動」→「データソース」→「作成」→「アプリケーションの選択」→「データソース・タイプの選択」→「マネージド」
<managed-data-source>
タグで、1つのマネージド・データソースを定義します。
次の例で、data-sources.xml
のマネージド・データソースの定義を示します。
<managed-data-source jndi-name="jdbc/ManagedDS" name="Managed DataSource Name" connection-pool-name="myConnectionPool"/>
ネイティブ・データソース設定へのパス
「OC4J: ホーム」→「管理」タブ→「タスク名: サービス」→「JDBCリソース」→「タスクに移動」→「データソース」→「作成」→「アプリケーションの選択」→「データソース・タイプの選択」→「ネイティブ」
<native-data-source>
タグで、1つのネイティブ・データソースを定義します。
native-data-source
タグには、0個以上のproperty
タグを指定できます。各property
タグでは、ネイティブ・データソース・インスタンスのプロパティを定義します。ネイティブ・データソース・オブジェクトでは、プロパティ値の設定にリフレクションが使用されます。プロパティ名は、そのプロパティを設定するためのsetterメソッドの名前と一致する必要があります(大/小文字も区別されます)。たとえば、コネクション・ファクトリ・オブジェクトにMyProp
というプロパティが存在する場合、そのプロパティを設定するためにsetMyProp()
というメソッドがコールされます。したがって、プロパティを正しく設定するためには、propertyタグの名前がMyProp
である必要があります。
<native-data-source name='My Native DataSource' jndi-name='jdbc/nativeDs' data-source-class='com.acme.DataSourceImpl' user='frank' password='frankpw' url='jdbc:acme:@localhost:5500:acme'> <property name="foo" value="bar" /> </native-data-source>
データソース構成の追加の例は、http://www.oracle.com/technology/tech/java/newsletter/articles/oc4j_datasource_config.htmlにある資料「Data Source Configuration in Oracle Application Server 10g」を参照してください。
「OC4J: ホーム」→「管理」タブ→「タスク名: サービス」→「JDBCリソース」→「タスクに移動」→「接続プール」→目的の設定にドリルダウン。
connection-factory
タグでは、データソースの接続を作成するためのコネクション・ファクトリを定義します。
factory-class
がjavax.sql.XADataSource
の実装である場合、コネクション・ファクトリから取得された接続は、グローバル・トランザクションに参加できます。この接続は、XA機能をエミュレートしません。factory-class
がjavax.sql.XADatatSource
の実装ではない場合、コネクション・ファクトリから取得された接続は、グローバル・トランザクションへの参加時にXA動作をエミュレートします。
1つの<connection-factory>
タグには、0個以上の<property>
タグを指定できます。各<property>
タグでは、コネクション・ファクトリ・インスタンスのプロパティを定義します。
コネクション・ファクトリがjava.sql.Driver
の実装である場合、これらの各ドライバ・プロパティは、データベースからの接続の取得時にドライバによって使用されるjava.util.Properties
オブジェクトに配置されます。
コネクション・ファクトリがjavax.sql.DataSource
、javax.sql.ConnectionPoolDataSource
またはjavax.sql.XADataSource
の実装である場合、プロパティ値を設定するためにコネクション・ファクトリ・オブジェクトでリフレクションが使用されます。
プロパティ名は、そのプロパティを設定するためのsetterメソッドの名前と一致する必要があります(大/小文字も区別されます)。たとえば、コネクション・ファクトリ・オブジェクトにMyProp
というプロパティが存在する場合、そのプロパティを設定するためにsetMyProp()
というメソッドがコールされます。したがって、プロパティを正しく設定するためには、property
タグの名前がMyProp
である必要があります。
1つの<connection-factory>
タグには、0個以上の<proxy-interface>
タグを指定できます。
各プロキシ・インタフェースは、コネクション・ファクトリから戻される接続オブジェクトと、それらの接続オブジェクトにより作成されるjava.sql.*
オブジェクトをラップするプロキシによって実装されます。
SQLオブジェクト設定で、プロキシ・インタフェースの定義対象となるjava.sql.*
オブジェクトを指定します。これは、次のいずれかである必要があります。
Array
Blob
CallableStatement
Connection
DatabaseMetaData
ParameterMetaData
PreparedStatement
Ref
resultSet
ResultSetMetaData
Savepoint
SQLData
SQLInput
SQLOutput
Struct
Statement
インタフェース属性で、このオブジェクトのプロキシが実装するインタフェースの完全修飾パスを定義します。
各SQLオブジェクトに対して複数のプロキシ・インタフェースを定義できます。
<xa-recover-config>
タグでは、グローバル・トランザクションの失敗時にトランザクション・マネージャでリカバリを実行するために必要な情報を定義します。<username>
サブタグでは、リカバリの実行時に使用するユーザー名を定義します。<password>
サブタグでは、リカバリの実行時に使用するパスワードを定義します。
<connection-properties>
タグでは、コネクション・ファクトリがoracle.jdbc.pool.OracleDataSource
のインスタンス(oracle.jdbc.pool.OracleDataSource
から導出されるインスタンスを含む)である場合にコネクション・ファクトリに設定する接続プロパティを定義します。各接続プロパティは、<property>
サブタグで定義します。<connection-properties>
タグには、0〜N個の<property>
サブタグを定義できます。
マネージド・データソースでは、接続を効率的に管理するため、接続プールを使用します。マネージド・データソースを作成する場合、少なくとも1つの接続プールと、そのコネクション・ファクトリを定義する必要があります。
<connection-pool>
タグで、1つの接続プールを定義します。
各<connection-pool>
タグには、<connection-factory>
タグが1つ含まれる必要があります。
Application Server Controlコンソールの設定 | <connection-pool>の属性 | 説明 |
---|---|---|
名前 |
|
必須。接続プールの名前。この値は、一意である必要があります。 |
最小接続数 |
|
たとえば、 |
最大接続数 |
|
値 負の値を指定すると、接続プールは有効になり、最大数の制限がなくなります。
セッションの開始時に、 |
接続キャッシュの初期サイズ |
|
キャッシュが最初に作成される場合、またはキャッシュが再初期化される場合の接続キャッシュのサイズ。このプロパティに
接続プールの
セッションの開始時に、
セッションの開始時に、 |
使用接続タイムアウトの待機時間 |
|
使用中の接続がクライアントから解放されるまで待機する時間(秒単位)。 このパラメータは、データソースから最大数の接続が取得されて使用中となっている場合にのみ適用されます。クライアントがプールから接続を取得しようとして、すべての接続が使用中の場合、接続プールでは、接続がプールに戻されるのを待機します。
タイムアウト設定を適用するには、 |
非アクティブのタイムアウト |
|
プールから削除する前に、使用されていない接続を非アクティブにして待機する時間(秒単位)。
タイムアウト設定を適用するには、 |
ログイン・タイムアウト |
|
データベースへの接続試行時にこのデータソースが待機する最大時間(秒単位)。
値
タイムアウト設定を適用するには、 |
接続再試行間隔 |
|
このパラメータは、
オプション設定です。デフォルトは、 |
最大接続試行回数 |
|
このパラメータは、
オプション設定です。デフォルトは、 |
接続の妥当性チェック |
|
Oracle Implicit Connection Cache専用。
プールから取得した接続をデータベースに対して検証するかどうかを指定します。この検証は、
値
オプション設定です。デフォルトは、 |
検証用のSQL文 |
|
Oracle Implicit Connection Cache専用。
オプション設定です。デフォルトはありません。 |
キャッシュする文の最大数 |
|
各接続でキャッシュするSQL文の最大数。 詳細は、「データソースでのJDBC文のキャッシュ・サイズの設定」を参照してください。 |
使用接続の最大アクティブ時間 |
|
Oracle Implicit Connection Cache専用。 このタイムアウト時間を超えると、使用中の接続は無条件にクローズされ、関連する文ハンドルは取り消され、接続は接続プールに戻されます。
タイムアウト設定を適用するには、 |
中止接続タイムアウト |
|
プールから削除する前に、使用されていない論理接続を非アクティブにして待機する時間(秒単位)。
このパラメータは、
たとえば、この接続で 接続が非アクティブの状態が指定した時間続くと、基礎となるPooledConnectionは回収され、再利用のためにキャッシュに戻されます。
タイムアウト設定を適用するには、 |
サーバー接続プールの無効化(チェック・ボックス) |
|
アプリケーション・サーバーの接続プールを無効にするかどうかを指定します。 このパラメータは、ドライバ内部に接続プールを保持する一部のJDBCドライバ用に提供されています。 JDBCドライバがOracleであり、ドライバでImplicit Connection Cacheを使用している場合、このパラメータは無視されます。
オプション設定です。デフォルトは、 |
タイムアウト制限の強制間隔 |
|
常にOracleデータベースと組み合せて使用します。キャッシュ・デーモン・スレッドでタイムアウト制限を強制する時間間隔(秒単位)です。
タイムアウト設定を適用するには、 |
プールの下限しきい値 |
|
常にOracleデータベースと組み合せて使用します。
オプション設定です。デフォルトは、 |
表5-4に、コネクション・ファクトリの属性とその説明を示します。
oracle.jdbc.pool.OracleDataSource
がdata-sources.xml
ファイルにconnection-factoryのfactory-classとして指定されている場合、OracleDataSourceによって提供されるICCはOC4Jにより有効化されます。ICCが不要な場合には、connection-factoryのconnectionCachingEnabled
プロパティをfalse
に設定することで無効化できます。次に例を示します。
<connection-pool name="myConnectionPool" min-connections="10" max-connections="100" max-connect-attempts="5" connection-retry-interval="3"> <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com"> <property name="connectionCachingEnabled" value="false"/> </connection-factory> </connection-pool>
この項では、data-sources.xml
構成ファイルのデータソース定義の例を示します。
デフォルト・アプリケーションのデータソース構成ファイルは、$J2EE_HOME/config/data-sources.xml
です。
各アプリケーションには、それぞれ独自のdata-sources.xml
ファイルを割り当てることができます。アプリケーションに独自ファイルを割り当てると、そのファイルは、アプリケーションのルート・ディレクトリに配置されます。
この項には、次の項目が含まれます。
データソース設定は、エンタープライズ・アプリケーションのdata-sources.xml
ファイルで永続化されます。このファイルの各<data-source>
タグは、JNDIにバインドされていてクライアント・コンポーネント(サーブレットやEJBなど)からアクセスできる1つのデータソースを示しています。
次の例は、data-sources.xml
ファイルの構文を示しています。詳細は、スキーマを参照してください。
<managed-data-source attr1="val1" attr2="val2" /> <native-data-source attr1="val1" attr2="val2" > <property name="propertyName" value="propertyValue" /> </native-data-source> <connection-pool attr1="val1" attr2="val2" > <connection-factory attr1="val1" attr2="val2" > <proxy-interface sql-object="javaSQLObject" interface=""/> <property name="propertyName" value="propertyValue"/> <xa-recover-config> <password-credential> <username></username> <password></password> </password-credential> </xa-recovery-config> <fatal-error-codes> <error-code code="integerCode"/> </fatal-error-codes> <connection-properties> <property name="propertyName value="propertyValue"/> </connection-properties> </connection-factory> </connection-pool
次に、data-sources.xml
の定義の移入例を示します。
<?xml version="1.0" standalone="yes"?> <data-sources> <connection-pool name="myConnectionPool" max-connections="30"> <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com" /> </connection-pool> <managed-data-source jndi-name="jdbc/ManagedDS" name="Managed DataSource Name" connection-pool-name="myConnectionPool" /> <native-data-source name="nativeDataSource" jndi-name="jdbc/nativeDS" data-source-class="com.acme.DataSourceImpl" user="frank" password="frankpw" url="jdbc:acme:@localhost:5500:acme" /> </data-sources>
この項では、データソースの構成例を示します。
データソース構成の追加の例は、http://www.oracle.com/technology/tech/java/newsletter/articles/oc4j_datasource_config.htmlにある資料「Data Source Configuration in Oracle Application Server 10g」を参照してください。
<native-data-source name='My Native DataSource' jndi-name='jdbc/nativeDs' data-source-class='com.acme.DataSourceImpl' user='frank' password='frankpw' url='jdbc:acme:@localhost:5500:acme'> <property name="foo" value="bar"/> </native-data-source>
このデータソースは、XA動作をエミュレートしません。XA動作のエミュレートの詳細は、「XAのエミュレート」を参照してください。
<managed-data-source name='My Managed DataSource' jndi-name='jdbc/managedDs_1' connection-pool-name='myConnectionPool'/> <connection-pool name='myConnectionPool' min-connections='5' max-connections='25'> <connection-factory factory-class='oracle.jdbc.xa.client.OracleXADataSource' user='scott' password='tiger' url='jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com' /> </connection-pool>
このデータソースは、XA動作をエミュレートします。XA動作のエミュレートの詳細は、「XAのエミュレート」を参照してください。
<managed-data-source name='My Managed DataSource' jndi-name='jdbc/managedDs_1' connection-pool-name='myConnectionPool'/> <connection-pool name='myConnectionPool' min-connections='5' max-connections='25'> <connection-factory factory-class='oracle.jdbc.pool.OracleDataSource' user='scott' password='tiger' url='jdbc:oracle:thin:@//localhost:1521/ Oracle.regress.rdbms.dev.us.oracle.com' /> </connection-pool>
このデータソースは、XA動作をエミュレートします。XA動作のエミュレートの詳細は、「XAのエミュレート」を参照してください。
<managed-data-source name='My Managed DataSource' jndi-name='jdbc/managedDs_1' connection-pool-name='myConnectionPool'/> <connection-pool name='myConnectionPool' min-connections='5' max-connections='25'> <connection-factory factory-class='oracle.jdbc.OracleDriver' user='scott' password='tiger' url='jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com' /> </connection-pool>
<connection-pool name='myConnectionPool' min-connections='5' max-connections='25'> <connection-factory factory-class='oracle.jdbc.pool.OracleDataSource' user='scott' password='tiger' url='jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com'> <proxy-interface sql-object="Connection" interface="oracle.jdbc.internal.OracleConnection"/> <proxy-interface sql-object="Statement" interface="oracle.jdbc.OracleStatement"/> <proxy-interface sql-object="CallableStatement" interface="oracle.jdbc.OracleCallableStatement"/> <proxy-interface sql-object="ResultSet" interface="oracle.jdbc.OracleResultSet"/> <proxy-interface sql-object="PreparedStatement" interface="oracle.jdbc.OraclePreparedStatement"/> </connection-factory> </connection-pool>
<connection-pool name='myConnectionPool' min-connections='5' max-connections='25'> <connection-factory factory-class='oracle.jdbc.xa.client.OracleXADataSource' user='scott' password='tiger' url='jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com'> <xa-recovery-config> <password-credential> <username>system</username> <password>manager</password> </password-credential> </xa-recovery-config> </connection-factory> </connection-pool>
<managed-data-source jndi-name="jdbc/managedDs_1" name="Managed DataSource" connection-pool-name="myConnectionPool" /> <connection-pool name="myConnectionPool"> <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url='jdbc:oracle:thin:@//localhost:1521/ oracle.regress.rdbms.dev.us.oracle.com'> <connection-properties> <property name="oracle.jdbc.RetainV9LongBindBehavior" value="true"/> </connection-properties> </connection-factory> </connection-pool>
接続プロパティの詳細は、「接続プロパティ」を参照してください。
グローバル
次の例では、data-sources.xml
ファイルのtx-level
属性をglobal
に設定して、マネージド・データソースをグローバル・トランザクション用に構成する方法を示します。
<managed-data-source jndi-name="jdbc/ManagedDS" name="Managed DataSource Name" connection-pool-name="myConnectionPool" tx-level="global" />
ローカル
次の例では、data-sources.xml
ファイルのtx-level
属性をlocal
に設定して、マネージド・データソースをローカル・トランザクション用に構成する方法を示します。デフォルト値は、global
です。
<managed-data-source jndi-name="jdbc/ManagedDS" name="Managed DataSource Name" connection-pool-name="myConnectionPool" tx-level="local" />
次に、Fast Connection Failoverのコネクション・ファクトリを構成する例を示します。
シン
<connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias) (PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=service_name)))" <property name="connectionCachingEnabled" value="true"/> <property name="fastConnectionFailoverEnabled" value="true" /> </connection-factory>
OCI
次に、OCIを使用するコネクション・ファクトリ定義の例を示します。
<connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:oci:@myAlias" />
OC4Jのデータソースは、Oracle10gのJDBCドライバと完全に統合されているため、自動的に高可用性(HA)およびFast Connection Failover(FCF)機能を使用できます。
高可用性とFast Connection Failoverの詳細は、次のドキュメントを参照してください。
Fast Connection Failoverは、JDBC Implicit Connection Cacheに実装されたRAC/FaNクライアントです。この機能の主な目的は、接続の有効性と可用性を保証することです。クライアント・サイドのFast Connection Failoverにより、次の機能が提供されます。
Fast Connection Failoverメカニズムを有効化するには、OracleDataSource
オブジェクトの<connection-factory>
タグで次のプロパティおよび属性を設定する必要があります。
次の例では、Fast Connection Failover用の接続キャッシュ設定におけるURLの用例として、有効な構文と無効な構文を示します。
有効なURLの用例
url="jdbc:oracle:oci:@TNS_ALIAS" url="jdbc:oracle:oci:@(DESCRIPTION= (LOAD_BALANCE=on) (ADDRESS=(PROTOCOL=TCP)(HOST=host1) (PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=service_name)))" url="jdbc:oracle:oci:@(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias) (PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=service_name)))" url = "jdbc:oracle:thin@//host:port/service_name" url = "jdbc:oracle:thin@//cluster-alias:port/service_name" url="jdbc:oracle:thin:@(DESCRIPTION= (LOAD_BALANCE=on) (ADDRESS=(PROTOCOL=TCP)(HOST=host1) (PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=service_name)))" url = "jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias) (PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=service_name)))"
無効なURLの用例
url = "jdbc:oracle:thin@host:port:SID"
data-sources.xmlファイルでのFast Connection Failoverの有効化
次に、data-sources.xml
ファイルでネイティブ・データソース用にFast Connection Failoverを有効化する例を示します。
<native-data-source name="nativeDataSource" jndi-name="jdbc/nativeDS" description="Native DataSource" data-source-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@(DESCRIPTION= (LOAD_BALANCE=on) (ADDRESS=(PROTOCOL=TCP)(HOST=host1) (PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=service_name)))"> <property name="connectionCacheName" value="ICC1"/> <property name="connectionCachingEnabled" value="true"/> <property name="fastConnectionFailoverEnabled" value="true"/> </native-data-source>
この項には、次の項目が含まれます。
この項では、Oracle JDBC OCIドライバとOracle JDBCシン・ドライバについて説明します。
Oracle JDBCドライバの詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。
この章のOracleデータソース定義の例では、Oracle JDBCシン・ドライバが使用されています。ただし、Oracle JDBC OCIドライバを使用することもできます。OC4Jサーバーを起動する前に、次の作業を実行します。
OLE_HOME
変数を設定します。
LD_LIBRARY_PATH
(または使用中のオペレーティング・システムの対応する環境変数)に$OLE_HOME/lib
を設定します。
TNS_ADMIN
に、適切なtnsnames.ora
ファイルを含む有効なOracle管理ディレクトリを設定します。
<connection-factory>要素定義のurl属性で使用するURLは、次のいずれかの形式です。
jdbc:oracle:oci:@
- このTNSエントリは、クライアントと同じシステム上にあるデータベース用で、クライアントはIPCモードでデータベースに接続します。
jdbc:oracle:oci:@TNS_service_name
- TNSサービス名は、インスタンスのtnsnames.oraファイルのエントリです。
jdbc:oracle:oci:@full_TNS_listener_description
- TNSの詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。
次の例では、OCIを使用するコネクション・ファクトリの定義を示します。
<connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:oci:@myAlias" />
この章のOracleデータソース定義の例では、Oracle JDBCシン・ドライバが使用されています。
クライアント・ライブラリの互換性に制限があることから、任意のバージョンのOracle JDBC-OCIドライバにアップグレードすることはできません。サポートされるのは、Oracle Application Server 10gリリース2(10.1.2)内にインストールされているOracle Clientライブラリと一致するOCIドライバ・バージョンへのアップグレードです。たとえば、Oracle JDBC 10.1.xドライバはサポートされますが、Oracle JDBC 9.2.xドライバはサポートされません。
Oracle Application ServerでJDBC-OCIの使用をサポートする場合、ORACLE_HOMEおよびライブラリ・パスの適切な値を起動環境に伝播するため、各OC4Jインスタンス用のopmn.xml
エントリも必要です。
環境変数ORACLE_HOME
は、すべてのプラットフォームに共通ですが、ライブラリ・パスを指定する環境変数の名前は、次のようにオペレーティング・システムごとに異なります。
opmn.xml
でライブラリ・パスを指定する一般的な構文は、次のとおりです。
<prop name="<LIB_PATH_VARIABLE>" value="<LIB_PATH_VARIABLE_VALUE>"/>
ここで、<LIB_PATH_VARIABLE>
は、ライブラリ・パスを指定するプラットフォーム固有の適切な変数名で置き換えます。また、<LIB_PATH_VARIABLE_VALUE>
は、その変数の値で置き換えます。
次の例では、Solarisオペレーティング・システムの場合を示します。
<process-type id="OC4J_SECURITY" module-id="OC4J"> <environment> <variable id="ORACLE_HOME" value="/u01/app/oracle/product/inf10120"/> <variable id="LD_LIBRARY_PATH" value="/u01/app/oracle/product/inf10120/lib"/> </environment>
異種データベースに接続する必要のあるアプリケーションでは、DataDirect JDBCドライバを使用できます。DataDirect JDBCドライバは、Oracleデータベース用ではありませんが、DB2、Sybase、Informix、SQLServerなどのOracle以外のデータベースに接続する場合に使用できます。
『DataDirect Connect for JDBC User's Guide and Reference』の説明に従ってDataDirect JDBCドライバをインストールします。
DataDirect JDBCドライバを使用するには、次のようにします。
DDJD_INSTALL
と呼ばれます。
DDJD_INSTALL
/lib
にあるDataDirect JDBCライブラリを共有ライブラリにアップロードします。DataDirectドライバを使用するには、YMbase.jar
およびYMutil.jar
ライブラリが必要です。
ORACLE_HOME/config/data-sources.xml
ファイルに追加します。
この項では、次のOracle以外の各データベースについてデータソース・エントリの例を示します。
ベンダー固有のデータソースをクラス属性で直接使用することもできます。つまり、クラス属性でOC4J固有のデータソースを使用する必要はありません。
詳細は、『DataDirect Connect for JDBC User's Guide and Reference』を参照してください。
データソース構成の追加の例は、http://www.oracle.com/technology/tech/java/newsletter/articles/oc4j_datasource_config.htmlにある資料「Data Source Configuration in Oracle Application Server 10g」を参照してください。
<managed-data-source name="db2" jndi-name="jdbc/db2" connection-pool-name="db2 Connection Pool"/> <connection-pool name="db2 Connection Pool"> <connection-factory factory-class="com.oracle.ias.jdbcx.db2.DB2DataSource" user="user1" password="user1" url="jdbc:oracle:db2://localhost:50000; DatabaseName=sample;PackageName=JDBCPKG"> <property name="databaseName" value="sample"/> <property name="packageName" value="JDBCPKG"/> <property name="serverName" value="localhost"/> <property name="portNumber" value="50000"/> <xa-recovery-config> <password-credential> <username>system</username> <password>manager</password> </password-credential> </xa-recovery-config> </connection-factory> </connection-pool>
<managed-data-source name="Sybase" jndi-name="jdbc/Sybase" connection-pool-name="Sybase Connection Pool"/> <connection-pool name=" Sybase Connection Pool"> <connection-factory factory-class="com.oracle.ias.jdbcx.sybase.SybaseDataSource" user="user1" password="password" url="jdbc:oracle:sybase://localhost:4101"> <property name="serverName" value="localhost"/> <property name="portNumber" value="4101"/> <xa-recovery-config> <password-credential> <username>system</username> <password>manager</password> </password-credential> </xa-recovery-config> </connection-factory> </connection-pool>
<managed-data-source name="Informix" jndi-name="jdbc/Informix" connection-pool-name="Informix Connection Pool"/> <connection-pool name=" Informix Connection Pool"> <connection-factory factory-class="com.oracle.ias.jdbc.informix.InformixDriver" user="user1" password="password" url="jdbc:oracle:informix://localhost:3900; informixServer=gtw93;DatabaseName=gatewaydb"> <xa-recovery-config> <password-credential> <username>userid</username> <password>pword</password> </password-credential> </xa-recovery-config> </connection-factory> </connection-pool>
この項では、SQLServerのマネージド・データソースの例とネイティブ・データソースの例を示します。
<connection-pool name="ConnectionSqlserver" max-connections="20" min-connections="1"> <connection-factory factory-class="com.oracle.ias.jdbcx.sqlserver.SQLServerDataSource" user="msuser" password="mspass" url="jdbc:oracle:sqlserver://myserver\ myinstance;User=msuser;Password=mspass"> <property name="serverName" value="myserver\myinstance" /> <xa-recovery-config> <password-credential> <username>msuser</username> <password>mspass</password> </password-credential> </xa-recovery-config> </connection-factory> </connection-pool> <managed-data-source connection-pool-name="ConnectionSqlserver" jndi-name="jdbc/mysqlserver" name="mysqlserver" />
<native-data-source jndi-name="jdbc/mysqlserver" name="mysqlserver" data-source-class="com.oracle.ias.jdbcx.sqlserver.SQLServerDataSource" user="msuser" password="mspass" url="jdbc:oracle:sqlserver://myserver\ myinstance;User=msuser;Password=mspass" > <property name="serverName" value="myserver\myinstance" /> </native-data-source>
次の追加のデータソース構成例では、データソース・タイプ、コネクション・ファクトリ・タイプ、および他の変数の様々な組合せを示します。これらの例は、http://www.oracle.com/technology/tech/java/newsletter/articles/oc4j_datasource_config.htmlにある資料「Data Source Configuration in Oracle Application Server 10g」からの抜粋です。
ネイティブ・データソース: Oracle JDBCからOracleデータベースへ
<native-data-source name="nativeDataSource" jndi-name="jdbc/nativeDS" description="Native DataSource" data-source-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@//dbhost:1521/dbservicename"> </native-data-source>
ネイティブ・データソース: DataDirect JDBCからDB2 UDBへ
<native-data-source name="nativeDataSource" jndi-name="jdbc/nativeDS" description="Native DataSource" data-source-class="com.ddtek.jdbcx.db2.DB2DataSource" user="frank" password="frankpw" url="jdbc:datadirect:db2://server_name:50000;DatabaseName=your_database"> </native-data-source>
ネイティブ・データソース: DB2 Universal JDBCからDB2 UDBへ
<native-data-source name="nativeDataSource" jndi-name="jdbc/nativeDS" description="Native DataSource" data-source-class="com.ibm.db2.jcc.DB2DataSource" user="db2adm" password="db2admpwd" url="jdbc:db2://sysmvs1.stl.ibm.com:5021/ dbname:user=db2adm;password=db2admpwd;" />
マネージド・データソース: XADataSourceコネクション・ファクトリを使用
<managed-data-source jndi-name="jdbc/ManagedDS" description="Managed DataSource" connection-pool-name="myConnectionPool"/> <connection-pool name="myConnectionPool" min-connections="10" max-connections="30" inactivity-timeout="30"> <connection-factory factory-class="oracle.jdbc.xa.client.OracleXADataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@//dbhost:1521/dbservicename" /> </connection-pool>
マネージド・データソース: DataSourceコネクション・ファクトリを使用
<managed-data-source jndi-name="jdbc/ManagedDS" description="Managed DataSource"> connection-pool-name="myConnectionPool"/> <connection-pool name="myConnectionPool" min-connections="10" max-connections="30" inactivity-timeout="30"> <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@//dbhost:1521/dbservicename" /> </connection-pool>
マネージド・データソース: Driverコネクション・ファクトリを使用
<managed-data-source jndi-name="jdbc/ManagedDS" description="Managed DataSource"> connection-pool-name="myConnectionPool"/> <connection-pool name="myConnectionPool" min-connections="10" max-connections="30" inactivity-timeout="30"> <connection-factory factory-class="oracle.jdbc.OracleDriver" user="scott" password="tiger" url="jdbc:oracle:thin:@//dbhost:1521/dbservicename" /> </connection-pool>
レガシー・データソース構成を使用する際には、次の事項を考慮する必要があります。
data-sources.xml
には、次の2つの構文があります。
http://xmlns.oracle.com/oracleas/schema/data-sources-10_1.xsd
スキーマに準拠します。
http://xmlns.oracle.com/ias/dtds/data-sources-9_04.dtd
スキーマに準拠します。
どちらの構文も有効ですが、新規構文を使用することをお薦めします。
data-sources.xml
に永続化される場合、その構文は、常に新規形式で記述されます。
data-sources.xml
ファイルの内容は、admin.jar
ユーティリティを使用することで、レガシーの旧構文から新規構文に明示的に変換できます。-convertDataSourceConfiguration
オプションを使用します。詳細は、次項「既存のデータソースの変換」で説明されています。
OC4Jでは、data-sources.xml
ファイルのレガシー形式を解釈できます。既存のデータソースの変更やデータソースの作成または削除など、data-sources.xml
ファイルの変更にApplication Server Controlコンソールが使用されている場合、古い形式のdata-sources.xml
ファイルが含まれるアプリケーションでは、OC4Jによりそのdata-sources.xml
ファイルが自動的に最新の形式に変換されます。
スタンドアロン環境でアクティブなOC4Jインスタンスを使用すると、次の構文でadmin.jar
を使用し、レガシーのdata-sources.xml
ファイルを現行の形式に手動で変換することもできます。詳細は、『Oracle Containers for J2EE構成および管理ガイド』を参照してください。このマニュアルでは、ORMI URLを指定できるのはOC4Jの稼働中のみであること、またはORMI URLがオプションであることは説明されていません。
java -jar admin.jar ormi://oc4jHost:oc4jOrmiPort adminId adminPassword -convertDataSourceConfiguration old-data-sources.xml new-data-sources.xml
OC4Jインスタンスが稼働していなくても、デプロイ前にdata-sources.xml
ファイルを変換することも可能です。このオフライン変換の構文は次のとおりです。
java -jar admin.jar -convertDataSourceConfiguration old-data-sources.xml new-data-sources.xml
手動または自動での変換後、新しいdata-sources.xml
ファイルを開いて調査し、アプリケーションと新しいファイルとの間に、データソースの参照に使用されるJNDIロケーションの整合性があることを確認します。新しいファイルには使用されないデータソース定義が含まれている場合があるので、この確認を行うことをお薦めします。
これは、古い形式で複数のロケーション属性(location
、ejb-location
、xa-location
など)が使用されていることが原因です。新しい形式への変換により、古いdata-sources.xml
ファイルに指定されているそれぞれのロケーション属性に対応する別のデータソースが、新しいdata-sources.xml
ファイルに作成されます。多くの場合、クライアント・アプリケーションでは、location
またはejb-location
属性で定義されたデータソースのみが使用されます。ただし、これは保証されているわけではありません。そのため、変換されたdata-sources.xml
にはアプリケーションで使用されない定義が含まれますが、ファイルから削除できます。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|