ヘッダーをスキップ

Oracle Containers for J2EE サービス・ガイド
10g(10.1.3.1.0)

B31858-01
目次
目次
索引
索引

戻る 次へ

5 データソース

この章では、Oracle Containers for J2EE(OC4J)のデータソースについて説明します。この章には、次の項目が含まれます。

タスク

この章では、次のOC4Jデータソース・タスクについて説明します。

新機能

次のOC4Jデータソースの機能および動作は、今回のリリースの新機能です。

廃止予定

次の項目は、今回のリリースで廃止予定です。

追加ドキュメント

追加のデータソース情報は、次のドキュメントを参照してください。

データソース・タイプ

データソースは、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ファイルの例は、「構成例」を参照してください。

構成に関する注意事項

接続プールの定義

マネージド・データソースでは、接続を効率的に管理するため、接続プールを使用します。マネージド・データソースを作成する場合、少なくとも1つの接続プールと、そのコネクション・ファクトリを定義する必要があります。

OC4Jには、再利用可能な物理接続のキャッシュを保持することで効率性を高める接続プール機能があります。クライアントによって接続がクローズされると、その接続は、別のクライアントで使用できるようプールに戻されます。接続プールにより、複数のクライアントで少数の物理接続を共有できるため、パフォーマンスとスケーラビリティが向上します。


注意

接続プールという語と接続キャッシュという語は、同じ意味です。  


接続プールの性質および用途の詳細は、「マネージド・データソースでの接続プールの使用方法」を参照してください。

Application Server Controlコンソールでのコネクション・ファクトリおよび接続プール設定へのパス

「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で事前定義されている致命的エラー・コードは、31133114103310341089および1090です。

Oracle以外のデータベースに致命的エラー・コードを定義する場合や、Oracleデータベースに別の致命的エラー・コードを追加する場合は、次の手順を使用します。

<connection-factory>要素のサブタグである<fatal-error-codes>要素を使用します。<fatal-error-codes>要素で、子要素の<error-code>を使用して1個の致命的エラー・コードを定義します。1つの<fatal-error-codes>要素に対して、0〜n個の<error-code>要素を定義できます。たとえば、致命的エラー・コードとして102030を設定する場合、データソース定義は次のようになります。

<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インスタンスを実行するためにはデフォルトのデータソースは不要です。


注意

個々のアプリケーション・レベル(独自のapplication.xml)に定義されているデフォルトのデータソースは、このグローバルのデフォルトのデータソースより優先されます。 


接続

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インタフェースのみを公開します。データソースのデプロイヤは、この方法により、プロキシ・オブジェクトによって公開されるインタフェースを制限できます。

データソースからの接続の取得

この項では、データソースから接続を取得して文を実行するためのサンプル・コードを示します。


注意

例外がスローされる場合でも、データソースから取得した接続は必ずクローズしてください。

ルックアップの実行に使用する文字列は、マネージド・データソースまたはネイティブ・データソースのJNDIロケーションを示すjndi-name設定の値と一致している必要があります。  


   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 ){}
      }
   }


注意

ユーザーとパスワードを渡さずにgetConnection()を使用した場合、コネクション・ファクトリの定義で指定されたユーザーとパスワードが自動的に使用され、正常に接続が作成されます。コネクション・ファクトリで指定されたユーザーとパスワードのペアが、属性とプロパティで異なる場合、getConnection()ではプロパティに指定されたユーザーとパスワードが使用されます。

コネクション・ファクトリでユーザーとパスワードを指定する方法は、表5-4「コネクション・ファクトリの属性」を参照してください。

コネクション・ファクトリのプロパティの詳細は、「コネクション・ファクトリのプロパティ」を参照してください。  


再試行

一定の状況下では、データソースにより接続を戻すことができない場合があります。この最も一般的な原因は、接続プールのすべての接続が使用中であることです。データソースを一定時間待機させた後に接続プールをチェックして、接続を戻す前に使用可能な接続があるかどうかを確認できます。

接続プールの構成設定には、プールの接続が使用できない場合の待機時間を制御する設定と、接続プールに接続が存在するかどうかを問い合せる試行の回数を制御する設定の2つがあります。

max-connect-attempts設定では、(接続プールのすべての接続が使用中の場合に)マネージド・データソースで接続プールから接続を取得する操作を再試行する回数を定義します。connection-retry-interval設定では、接続プールからの接続の取得に最後に失敗した後、次の取得操作を再試行するまでに待機する間隔を秒単位で指定します。これらの設定の詳細は、表5-3「接続プールの属性」を参照してください。

次の例で、Application Server Controlコンソールではなくdata-sources.xmlで再試行を構成する方法を示します。この例では、max-connect-attempts5回に、connection-retry-interval3秒に設定します。

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

Oracle JDBCネイティブ・データソースを使用したプロキシ認証

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文のキャッシュは、データソースで管理されている特定の物理接続と関連付けられます。文キャッシュは、データソースに関連付けられていないため、すべての物理接続で共有することはできません。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.DMSStatementMetricstrueに設定する必要があります。


注意

データソースでJDBC文のキャッシング機能を構成するには、num-cached-statements属性を使用してキャッシュのサイズを設定します。stmt-cache-size属性は、廃止予定です。  


文のキャッシュ・サイズのリソース問題

データソースにnum-cached-statementsを指定しても、文はデータソースや接続プールごとにではなく、接続ごとにキャッシュされます。つまり、特定のデータソースのnum-cached-statements0より大きい場合、そのデータソースから取得されたマネージド接続ごとに独自の文キャッシュが保持されます。

接続の文キャッシュに保持されている文は、データベース・リソースを解放しない可能性があることに注意してください。オープンしている接続の数と、接続ごとにキャッシュされている文の数の合計が、データベースに許可されたオープン・カーソルの制限を超える可能性があります。num-cached-statementsの値を減らすか、データベースに許可されたオープン・カーソルの制限を増やすことで、この問題を回避できる場合があります。

マネージド・データソースでの文プロキシ

java.sql.*インタフェース(マネージド・データソース)のすべての実装は、OC4Jによりプロキシ・オブジェクトでラップされます。これには、文オブジェクト(java.sql.Statementjava.sql.PreparedStatementおよびjava.sql.CallableStatement)も含まれます。

プロキシの設定方法の詳細は、表5-3「接続プールの属性」に記載されているコネクション・ファクトリの「プロキシ・インタフェース」タブの説明を参照してください。

一定の状況下では、接続プロキシが新しい物理接続にリバインドされる場合があります。これは、接続プロキシが1つのトランザクション全体で使用される場合などに発生します。リバインドが発生すると、接続プロキシを通じて取得された文オブジェクトは、古い物理接続を使用して作成されているため、すべて無効になります。このため、物理接続から取得される文オブジェクトに対しても、プロキシが配置されます。これらの文プロキシは、基礎となる物理接続との関連を監視できるように、取得元の接続プロキシと関連付けられます。文プロキシにより、接続プロキシに関連付けられた物理接続が変化したと判断されると、接続プロキシから新しい物理文が取得されます。

java.sql.Statementjava.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がコールされるまでコミットまたはロールバックされません。この動作は、分散トランザクションでコミットまたはロールバックが実行される場合でも同様です。このケースでは、接続は、構文的にトランザクション境界を伴って出現するだけで、意味的にはそのトランザクションに参加しません(つまり、この接続は登録されません)。

例:

次のコード例では、前述の手順を実装します。

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.  

ローカル・トランザクション管理

通常、ローカル・トランザクションは、クライアントが接続上でautoCommitfalseに設定すると開始し、クライアントが同じ接続上でcommit()またはrollback()をコールすると終了します。autoCommitfalseで、トランザクション作業が実行されていない場合、接続で明示的にcommit()またはrollback()をコールする必要はありません(トランザクション作業が実行されていないためにコミットやロールバックが不要であることは、ドライバにより正しく認識されます)。

OC4Jは、autoCommitfalseであり、かつcommit()rollback()setAutoCommit(true)またはclose()以外の任意のメソッドが接続上でコールされると、アクティブなローカル・トランザクションがその接続に存在すると判断します(ただし、OC4Jは、接続上で処理される作業が実際にトランザクション形式の作業であるかどうかは判断できません)。commit()rollback()のコール、またはautoCommitの値の変更が発生すると、現在のローカル・トランザクションは終了します。autoCommitfalseであり、かつcommit()rollback()setAutoCommit(true)またはclose以外のメソッドが引き続き接続上でコールされると、OC4Jは、それを新しいローカル・トランザクションの開始と判断します。

クライアントが接続で(commit()rollback()またはsetAutoCommit(true)をコールして)明示的にローカル・トランザクションを終了しない場合については、次の2つのケースを検討する必要があります。

OC4Jでは、次の2つの方法でこれらのケースを処理できます。

グローバル・トランザクション(XA)

グローバル・トランザクション用に構成されたマネージド・データソースは、グローバル・トランザクションに参加できる接続を戻します。グローバル・トランザクション(分散トランザクション)では、トランザクションに複数のリソースが登録されます。

未処理の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リカバリ

グローバル・トランザクションが失敗した場合、トランザクション・マネージャでXAリカバリを実行する必要があります。この場合、リカバリするリソースごとにいくつかの情報を定義しておく必要があります。データソースでは、factory-classにjavax.sql.XADataSourceを使用するコネクション・ファクトリごとに、リカバリ用のusernamepasswordを定義します。

表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>


注意

  • factory-classjava.sql.Driverjavax.sql.DataSourceまたはjavax.sql.ConnectionPoolDataSourceのインスタンスである場合、XAリカバリ構成は不要です。詳細は、「XAのエミュレート」を参照してください。

  • OracleXADataSourceも、javax.sql.XADataSourceのインスタンスです。

 

XAのエミュレート

エミュレートされた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.Driverjavax.sql.DataSourceまたはjavax.sql.ConnectionPoolDataSourceのインスタンスである場合、このデータソースでXA動作がエミュレートされます。

データソース・オブジェクトの構成

この項では、Application Server Controlコンソールで設定するか、data-sources.xmlファイルで直接設定するかを問わず、様々なデータソース関連オブジェクトの構成設定とその説明を示します。

各設定は、次の表に記載されています。

データソース・オブジェクトを構成する方法の詳細は、「データソースの定義」を参照してください。

マネージド・データソース

マネージド・データソースを定義するには、1つ以上の接続プールを定義する必要があります。

マネージド・データソース設定へのパス

「OC4J: ホーム」→「管理」タブ→「タスク名: サービス」→「JDBCリソース」→「タスクに移動」→「データソース」→「作成」→「アプリケーションの選択」→「データソース・タイプの選択」→「マネージド」

次の例で、data-sources.xmlのマネージド・データソースの定義を示します。

<managed-data-source
   jndi-name="jdbc/ManagedDS"
   name="Managed DataSource Name"
   connection-pool-name="myConnectionPool"/>
表5-1    マネージド・データソースの設定 
Application Server Controlコンソールのプロパティ  <managed-data-source>の属性  説明 

名前 

name 

必須。データソースの名前。この値は、一意である必要があります。

この名前は、JDBCDataSource管理オブジェクトのnameキー・プロパティとして使用されます(j2eeType=JDBCDataSource,name=data source name)。  

JNDIロケーション 

jndi-name 

必須。データソース・オブジェクトのJNDI論理名。OC4Jでは、データソースのインスタンスが、この値を持つアプリケーションJNDIネームスペースにバインドされます。 

接続プール 

connection-pool-name 

必須。このマネージド・データソースで接続を取得するのに使用する接続プールの名前。  

スキーマ 

schema 

EJBのOrion CMP実装の使用時における、このデータソースのデータベース・スキーマへのパス。これは、下位互換性を目的として提供されています。  

トランザクション・レベル 

tx-level 

このマネージド・データソースでサポートされるトランザクション・レベル。

localを指定すると、このデータソースと生成される接続は、ローカル・トランザクションにのみ参加できます。

globalを指定すると、このデータソースと生成される接続は、ローカルおよびグローバル・トランザクションに参加できます。

オプション設定です。デフォルトは、globalです。 

ローカル・トランザクション管理 

manage-local-transactions 

OC4Jでローカル・トランザクションを管理するかどうかを指定します。

  • この設定がtrueで、接続のautoCommitfalseであると、次のようになります。

    接続でclose()がコールされると、OC4Jは、接続でcommit()をコールしてからclose()をコールします。

    接続がグローバル・トランザクションで使用されている場合、OC4Jは、接続でrollback()をコールし、例外をスローします。

  • この設定がfalseで、接続のautoCommitfalseであると、次のようになります。

    接続でclose()がコールされると、OC4Jは、接続でcommit()をコールせずにclose()をコールします。ローカル・トランザクションの処理方法は、JDBCドライバにより決定されます。

    接続がグローバル・トランザクションで使用されている場合、OC4Jは、接続でrollback()をコールせず、例外もスローしません。ローカル・トランザクションの処理方法は、JDBCドライバにより決定されます。

オプション設定です。デフォルトは、trueです。 

SQLオブジェクト管理 

manage-sql-objects 

OC4Jでjava.sql.*オブジェクトを管理する方法を決定します。これらのオブジェクトのいずれかを管理する場合、そのオブジェクトは、OC4Jによってプロキシでラップされます。また、オブジェクトで起動されるメソッドは、OC4Jの割込みを受けます。

allを指定すると、すべてのjava.sql.*オブジェクトがOC4Jにより管理されます。

basicを指定すると、java.sql.Connectionjava.sql.Statementjava.sql.PreparedStatementおよびjava.sql.CallableStatementオブジェクトのみOC4Jにより管理されます。

minimalを指定すると、プールの管理および制限付きのトランザクション登録用のjava.sql.ConnectionオブジェクトのみがOC4Jにより管理されます。Connectionがグローバル・トランザクションのコンテキストで取得された場合、その接続はOC4Jによりグローバル・トランザクションに登録されます。接続/トランザクションの関連を管理するためにConnectionメソッドは捕捉されないため、Connectionはトランザクション境界全体でキャッシュされません。そのためConnectionは、それが取得されたトランザクション・コンテキストでのみ使用し、トランザクションが完了したら終了する必要があります。Statementオブジェクトはこの構成ではラップされないため、Statementオブジェクトでのメソッドの起動に関連するオーバーヘッドはありません。

オプション設定です。デフォルトは、basicです。 

ログイン・タイムアウト 

login-timeout 

データベースへの接続試行時にこのデータソースが待機する最大時間(秒単位)。値0(ゼロ)を指定すると、デフォルトのシステム・タイムアウト時間が存在する場合はその時間となり、存在しない場合はタイムアウトなしとなります。

オプション設定です。デフォルトは、0です。 

ユーザー 

user 

データベースへの接続に使用するデフォルト・ユーザー。

オプション設定です。デフォルトはありません。  

パスワード 

password 

データベースへの接続に使用するデフォルト・パスワード。

オプション設定です。デフォルトはありません。  

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

ネイティブ・データソース設定へのパス

「OC4J: ホーム」→「管理」タブ→「タスク名: サービス」→「JDBCリソース」→「タスクに移動」→「データソース」→「作成」→「アプリケーションの選択」→「データソース・タイプの選択」→「ネイティブ」

データソース構成の追加の例は、http://www.oracle.com/technology/tech/java/newsletter/articles/oc4j_datasource_config.htmlにある資料「Data Source Configuration in Oracle Application Server 10g」を参照してください。

表5-2    ネイティブ・データソースの設定 
Application Server Controlコンソールのプロパティ  <native-data-source>の属性  説明 

名前 

name 

必須。データソースの名前。この値は、一意である必要があります。 

JNDIロケーション 

jndi-name 

必須。データソース・オブジェクトのJNDI論理名。OC4Jでは、データソースのインスタンスが、この値を持つアプリケーションJNDIネームスペースにバインドされます。  

データ・ソース・クラス 

data-source-class 

必須。データソース・クラス実装の名前とパス。このクラスは、javax.sql.DataSourceを実装している必要があります。 

URL 

url 

必須。データベースに接続するためにJDBCドライバにより使用されるURL。URLでは、通常、データベース・ホスト・マシン、ポートおよびデータベース名を指定します。たとえば、jdbc:acme:@localhost:1234:acmeと指定します。 

ログイン・タイムアウト 

login-timeout 

データベースへの接続試行時にこのデータソースが待機する最大時間(秒単位)。値0(ゼロ)を指定すると、デフォルトのシステム・タイムアウト時間が存在する場合はその時間となり、存在しない場合はタイムアウトなしとなります。

オプション設定です。デフォルトは、0です。 

ユーザー 

user 

データソースへの接続に使用するデフォルト・ユーザー。

オプション設定です。デフォルトはありません。  

パスワード 

password 

データソースへの接続に使用するデフォルト・パスワード。

オプション設定です。デフォルトはありません。  

接続プールとコネクション・ファクトリ

コネクション・ファクトリおよび接続プール設定へのパス

「OC4J: ホーム」→「管理」タブ→「タスク名: サービス」→「JDBCリソース」→「タスクに移動」→「接続プール」→目的の設定にドリルダウン。

コネクション・ファクトリ

connection-factoryタグでは、データソースの接続を作成するためのコネクション・ファクトリを定義します。

factory-classjavax.sql.XADataSourceの実装である場合、コネクション・ファクトリから取得された接続は、グローバル・トランザクションに参加できます。この接続は、XA機能をエミュレートしません。factory-classjavax.sql.XADatatSourceの実装ではない場合、コネクション・ファクトリから取得された接続は、グローバル・トランザクションへの参加時にXA動作をエミュレートします。

コネクション・ファクトリのプロパティ

1つの<connection-factory>タグには、0個以上の<property>タグを指定できます。各<property>タグでは、コネクション・ファクトリ・インスタンスのプロパティを定義します。

コネクション・ファクトリがjava.sql.Driverの実装である場合、これらの各ドライバ・プロパティは、データベースからの接続の取得時にドライバによって使用されるjava.util.Propertiesオブジェクトに配置されます。

コネクション・ファクトリがjavax.sql.DataSourcejavax.sql.ConnectionPoolDataSourceまたはjavax.sql.XADataSourceの実装である場合、プロパティ値を設定するためにコネクション・ファクトリ・オブジェクトでリフレクションが使用されます。

プロパティ名は、そのプロパティを設定するためのsetterメソッドの名前と一致する必要があります(大/小文字も区別されます)。たとえば、コネクション・ファクトリ・オブジェクトにMyPropというプロパティが存在する場合、そのプロパティを設定するためにsetMyProp()というメソッドがコールされます。したがって、プロパティを正しく設定するためには、propertyタグの名前がMyPropである必要があります。


注意

コネクション・ファクトリでは、次の例のように、属性とプロパティに2つの異なるユーザーとパスワードの組合せを指定できます。この例の場合、getConnection()では、属性に指定されたユーザーとパスワードではなく、プロパティに指定されたユーザーとパスワード(scott2とtiger2)が使用されます。

    <connection-factory user="scott1" password="tiger1" ...>
<property name="user" value="scott2" />
<property name="password" value="tiger2" />
</connection-factory>
 

コネクション・ファクトリのプロキシ・インタフェース

1つの<connection-factory>タグには、0個以上の<proxy-interface>タグを指定できます。

各プロキシ・インタフェースは、コネクション・ファクトリから戻される接続オブジェクトと、それらの接続オブジェクトにより作成されるjava.sql.*オブジェクトをラップするプロキシによって実装されます。

SQLオブジェクト設定で、プロキシ・インタフェースの定義対象となるjava.sql.*オブジェクトを指定します。これは、次のいずれかである必要があります。

インタフェース属性で、このオブジェクトのプロキシが実装するインタフェースの完全修飾パスを定義します。

各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つ含まれる必要があります。

表5-3    接続プールの属性 
Application Server Controlコンソールの設定   <connection-pool>の属性  説明 

名前 

name 

必須。接続プールの名前。この値は、一意である必要があります。  

最小接続数 

min-connections 

接続プールで保持する接続の最小数。

オプション設定です。デフォルトは、0です。

min-connections設定では、次のアクティビティが想定される場合に、任意の時点でプール内に保持する接続の最小数を指定します。

  • 使用中の接続が1つも存在しない場合。使用中の接続がある場合、それらはプールに存在しないため、<min-connections>で指定した数の接続がプールに存在する可能性があります。

  • すでに十分な数の接続が作成されており、それらの接続の作成に接続プールが必要とされるほど接続が同時に使用された場合。

たとえば、min-connections10で、それまでに使用された接続が2つのみの場合、プール内で使用可能な接続の数は2です。OC4Jでは、不必要な接続は作成されません。  

最大接続数 

max-connections 

接続プールで保持する接続の最大数。

0を指定すると、次のようになります。

  • データソースの接続プールは、無効になります。接続はプールされません。

  • 他のすべての接続プール設定は、無視されます。

負の値を指定すると、接続プールは有効になり、最大数の制限がなくなります。

オプション設定です。デフォルトは、無制限です。

セッションの開始時に、max-connectionsの設定値がmin-connectionsより小さいと、min-connectionsmax-connectionsの値に再設定されます。  

接続キャッシュの初期サイズ 

initial-limit 

キャッシュが最初に作成される場合、またはキャッシュが再初期化される場合の接続キャッシュのサイズ。このプロパティに0より大きい値を設定すると、複数の接続が事前に作成されていつでも使用できる状態になります。このパラメータは、通常、最適なキャッシュ・サイズを準備するまでの時間を短縮するために使用します。

オプション設定です。デフォルトは、0です。

接続プールのinitial-limit1より大きいが、connection-factoryでuser/passwordが指定されていない場合、OC4Jは起動に失敗し、エラーをスローします。表5-4「コネクション・ファクトリの属性」の下にある「注意」を参照してください。

セッションの開始時に、initial-limitmax-connectionsより大きい場合(たとえば、initial-limit=10に対してmax-connections=5など)、max-connectionsの数(5)の接続のみが初期化されます。

セッションの開始時に、initial-limitmin-connectionsより小さい場合(たとえば、initial-limit=10に対してmin-connections=15など)、initial-limitの数(10)の接続のみが初期化されます。その後、さらに多くの接続がコールされた場合、min-connectionsの数の接続がプールで保持されます。  

使用接続タイムアウトの待機時間 

used-connection-wait-timeout 

使用中の接続がクライアントから解放されるまで待機する時間(秒単位)。

このパラメータは、データソースから最大数の接続が取得されて使用中となっている場合にのみ適用されます。クライアントがプールから接続を取得しようとして、すべての接続が使用中の場合、接続プールでは、接続がプールに戻されるのを待機します。

オプション設定です。デフォルトは、0です。

タイムアウト設定を適用するには、property-check-intervalがタイムアウト設定未満である必要があります。  

非アクティブのタイムアウト 

inactivity-timeout 

プールから削除する前に、使用されていない接続を非アクティブにして待機する時間(秒単位)。

オプション設定です。デフォルトは、60です。

タイムアウト設定を適用するには、property-check-intervalがタイムアウト設定未満である必要があります。  

ログイン・タイムアウト 

login-timeout 

データベースへの接続試行時にこのデータソースが待機する最大時間(秒単位)。

0を指定すると、デフォルトのシステム・タイムアウト時間が存在する場合はその時間となり、存在しない場合はタイムアウトなしとなります。

オプション設定です。デフォルトは、0です。

タイムアウト設定を適用するには、property-check-intervalがタイムアウト設定未満である必要があります。  

接続再試行間隔 

connection-retry-interval 

失敗した接続試行を再実行するまでの待機間隔(秒単位)。

このパラメータは、max-connect-attemptsと組み合せて使用します。

オプション設定です。デフォルトは、1です。 

最大接続試行回数 

max-connect-attempts 

接続の再試行回数。

このパラメータは、connection-retry-intervalと組み合せて使用します。

オプション設定です。デフォルトは、3です。 

接続の妥当性チェック 

validate-connection 

Oracle Implicit Connection Cache専用。

プールから取得した接続をデータベースに対して検証するかどうかを指定します。この検証は、validate-connection-statementパラメータの値で指定されたSQL文によって実行されます。

trueを指定すると、接続が接続プールから取得されるときに、その接続の有効性を検証するSQL文が実行されます。

オプション設定です。デフォルトは、false(検証なし)です。  

検証用のSQL文 

validate-connection-statement 

Oracle Implicit Connection Cache専用。

validate-connectiontrueの場合、接続がプールから取得されるときにこのSQL文が実行されます。

オプション設定です。デフォルトはありません。  

キャッシュする文の最大数 

num-cached-statements 

各接続でキャッシュするSQL文の最大数。0より大きい値を指定すると、データソースの文キャッシュが自動的に有効化されます。

オプション設定です。デフォルトは、0です。

詳細は、「データソースでのJDBC文のキャッシュ・サイズの設定」を参照してください。  

使用接続の最大アクティブ時間 

time-to-live-timeout 

Oracle Implicit Connection Cache専用。

使用中の接続をアクティブにする最大時間(秒単位)。

このタイムアウト時間を超えると、使用中の接続は無条件にクローズされ、関連する文ハンドルは取り消され、接続は接続プールに戻されます。

オプション設定です。デフォルトは、-1(無効)です。

タイムアウト設定を適用するには、property-check-intervalがタイムアウト設定未満である必要があります。  

中止接続タイムアウト 

abandoned-connection-timeout 

Oracleデータベース専用。

プールから削除する前に、使用されていない論理接続を非アクティブにして待機する時間(秒単位)。

このパラメータは、inactivity-timeoutに類似していますが、対象となるのはユーザーによってキャッシュから取得された論理接続です。設定すると、JDBCにより、この論理接続のSQLデータベース・アクティビティが監視されます。

たとえば、この接続でstmt.execute()が起動されると、この接続がアクティブであることを通知するハートビートが登録されます。ハートビートは、(監視コストを抑えるため)データベースの実行操作がコールされる場所でのみ監視されます。

接続が非アクティブの状態が指定した時間続くと、基礎となるPooledConnectionは回収され、再利用のためにキャッシュに戻されます。

オプション設定です。デフォルトは、-1(無効)です。

タイムアウト設定を適用するには、property-check-intervalがタイムアウト設定未満である必要があります。  

サーバー接続プールの無効化(チェック・ボックス) 

disable-server-connection-pooling 

アプリケーション・サーバーの接続プールを無効にするかどうかを指定します。

このパラメータは、ドライバ内部に接続プールを保持する一部のJDBCドライバ用に提供されています。

JDBCドライバがOracleであり、ドライバでImplicit Connection Cacheを使用している場合、このパラメータは無視されます。

オプション設定です。デフォルトは、false(プール有効)です。 

タイムアウト制限の強制間隔 

property-check-interval 

Oracleデータベース専用。

常にOracleデータベースと組み合せて使用します。キャッシュ・デーモン・スレッドでタイムアウト制限を強制する時間間隔(秒単位)です。

オプション設定です。デフォルトは、900です。

タイムアウト設定を適用するには、property-check-intervalがタイムアウト設定未満である必要があります。  

プールの下限しきい値 

lower-threshold-limit 

Oracleデータベース専用。

常にOracleデータベースと組み合せて使用します。max-connectionsの値に対する割合で示される接続プールの下限しきい値です。

オプション設定です。デフォルトは、20パーセントです。 

表5-4に、コネクション・ファクトリの属性とその説明を示します。

表5-4    コネクション・ファクトリの属性 
Application Server Controlコンソールの設定   <connection-factory>の属性  説明 

コネクション・ファクトリ・クラス 

factory-class 

必須。データソースの接続の作成に使用するコネクション・ファクトリ・クラスの名前とパス。このクラスは、JDBCドライバにより提供されます。たとえば、com.acme.AcmeDataSourceと指定します。

このクラスは、java.sql.Driverjavax.sql.DataSourcejavax.sql.ConnectionPoolDataSourceまたはjavax.sql.XADataSourceを実装している必要があります。

factory-classjavax.sql.XADataSourceの実装である場合、コネクション・ファクトリから取得された接続は、グローバル・トランザクションに参加できます。この接続は、XA機能をエミュレートしません。factory-classjavax.sql.XADatatSourceの実装ではない場合、コネクション・ファクトリから取得された接続は、グローバル・トランザクションへの参加時にXA動作をエミュレートします。 

URL 

url 

必須。データベースに接続するためにJDBCドライバにより使用されるURL。URLでは、通常、データベース・ホスト・マシン、ポートおよびデータベース名を指定します。たとえば、jdbc:acme:@localhost:1234:acmeと指定します。 

ユーザー 

user 

データベースへの接続に使用するデフォルト・ユーザー。

オプション設定です。デフォルトはありません。

connection-poolのinitial-limitが1より大きいが、connection-factoryでuser/passwordが指定されていない場合、OC4Jは起動に失敗し、エラーをスローします。この表の下にある「注意」を参照してください。  

パスワード 

password 

データベースへの接続に使用するデフォルト・パスワード。

オプション設定です。デフォルトはありません。  

ログイン・タイムアウト 

login-timeout 

データベースへの接続試行時にこのデータソースが待機する最大時間(秒単位)。

0を指定すると、デフォルトのシステム・タイムアウト時間が存在する場合はその時間となり、存在しない場合はタイムアウトなしとなります。

オプション設定です。デフォルトは、0です。 


注意

connection-poolのinitial-limitが1より大きいが、connection-factoryでuser/passwordが指定されていない場合、OC4Jは起動に失敗し、エラーをスローします。

重大: コネクタの初期化中にエラーが発生しました。例外: データソースの接続プールの作成中にエラーが発生しました。例外: oracle.oc4j.sql.DataSourceException: ConnectionCacheManagerのインスタンスを取得/作成できませんでした。例外: ユーザー資格証明がcom.evermind.server.ApplicationStateRunning initConnectorの既存の資格証明と一致しません。

このエラーは、プールの接続を初期化するためのユーザーとパスワードが存在しない場合に発生します。  


ICCの無効化

oracle.jdbc.pool.OracleDataSourcedata-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-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>

例: XADataSourceコネクション・ファクトリを使用したマネージド・データソース

このデータソースは、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>

例: DataSourceコネクション・ファクトリを使用したマネージド・データソース

このデータソースは、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>

例: Driverコネクション・ファクトリを使用したマネージド・データソース

このデータソースは、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>

例: XAリカバリの定義

<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の構成

次に、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" />

高可用性およびFast Connection Failoverの使用方法

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>タグで次のプロパティおよび属性を設定する必要があります。

表5-5    Fast Connection Failoverの設定 
設定  説明 

connectionCachingEnabled 

これは、ブール型プロパティであり、trueに設定すると接続キャッシュが有効化されます。デフォルトでは、接続キャッシュは無効であり、プロパティ値はfalseに設定されています。 

fastConnectionFailoverEnabled 

このプロパティをtrueに設定すると、Fast Connection Failoverメカニズムが有効化されます。デフォルトでは、Fast Connection Failoverは無効であり、プロパティ値はfalseに設定されています。  

url 

これは、<connection-factory>タグの属性です。Fast Connection Failoverを有効化する場合、サービス名の構文を使用してURLを設定する必要があります。接続URLに指定されたサービス名は、接続キャッシュをサービスにマップするために使用されます。Fast Connection Failoverが有効な場合にSIDをURLに指定すると、例外がスローされます。  

次の例では、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>

JDBCドライバの使用方法

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

Oracle JDBCドライバ

この項では、Oracle JDBC OCIドライバとOracle JDBCシン・ドライバについて説明します。

Oracle JDBCドライバの詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。

OCI

この章のOracleデータソース定義の例では、Oracle JDBCシン・ドライバが使用されています。ただし、Oracle JDBC OCIドライバを使用することもできます。OC4Jサーバーを起動する前に、次の作業を実行します。

  1. OC4JがインストールされているシステムにOracle Clientをインストールします。

  2. OLE_HOME変数を設定します。

  3. LD_LIBRARY_PATH(または使用中のオペレーティング・システムの対応する環境変数)に$OLE_HOME/libを設定します。

  4. TNS_ADMINに、適切なtnsnames.oraファイルを含む有効なOracle管理ディレクトリを設定します。

<connection-factory>要素定義のurl属性で使用するURLは、次のいずれかの形式です。

次の例では、OCIを使用するコネクション・ファクトリの定義を示します。

<connection-factory 
    factory-class="oracle.jdbc.pool.OracleDataSource"
    user="scott"
    password="tiger"
    url="jdbc:oracle:oci:@myAlias" />

シン

この章のOracleデータソース定義の例では、Oracle JDBCシン・ドライバが使用されています。

Oracle Application ServerでのOracle JDBC-OCIドライバのアップグレードに関する注意事項

クライアント・ライブラリの互換性に制限があることから、任意のバージョンの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>

Oracle以外のデータベースのJDBCドライバ

異種データベースに接続する必要のあるアプリケーションでは、DataDirect JDBCドライバを使用できます。DataDirect JDBCドライバは、Oracleデータベース用ではありませんが、DB2、Sybase、Informix、SQLServerなどのOracle以外のデータベースに接続する場合に使用できます。

DataDirect JDBCドライバの使用方法

『DataDirect Connect for JDBC User's Guide and Reference』の説明に従ってDataDirect JDBCドライバをインストールします。

DataDirect JDBCドライバを使用するには、次のようにします。

  1. DataDirect JDBCドライバの内容をディレクトリに解凍します。このディレクトリは、DDJD_INSTALLと呼ばれます。

  2. Oracle Enterprise Manager 10gコンソールで共有ライブラリを作成(「管理」「共有ライブラリ」)し、DDJD_INSTALL/libにあるDataDirect JDBCライブラリを共有ライブラリにアップロードします。DataDirectドライバを使用するには、YMbase.jarおよびYMutil.jarライブラリが必要です。

  3. 「DataDirectのデータソース・エントリの例」で説明されているように、データベースのデータソース定義をORACLE_HOME/config/data-sources.xmlファイルに追加します。

  4. 手順2で作成した共有ライブラリをインポートしたことを確認し、Oracle Enterprise Manager 10gコンソールから、アプリケーションをデプロイ(「アプリケーション」「デプロイ」)します。


    注意

    共有ライブラリ作成の詳細は、『Oracle Containers for J2EE開発者ガイド』の第3章を参照してください。 


DataDirectのデータソース・エントリの例

この項では、次の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」を参照してください。

DataDirect DB2


注意

DataDirect JDBCドライバを使用してDB2に接続する場合、次の制限事項があります。

  • 次の項目は、例外的な動作です。

    com.oracle.ias.jdbcx.db2.DB2DataSourceをコネクション・ファクトリ・クラスとして使用する場合、<url>は必須要素ですが、url属性で渡される値は無視されます。このため、urlのみを設定すれば十分です。

    データソースが正しく動作するためには、<property>要素にserverNameportNumberおよびdatabaseNameを設定する必要があります。

  • com.oracle.ias.jdbc.db2.DB2Driverをコネクション・ファクトリ・クラスとして使用する場合、<property>要素にserverNameportNumberおよびdatabaseNameを設定する必要はありません。serverNameportNumberおよびdatabaseNameは、url属性に設定できます。urlは完全に解釈され、url属性で渡される値も読み取られます。

 

<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>
DataDirect Sybase
<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>
DataDirect Informix
<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>
DataDirect SQLServer

この項では、SQLServerのマネージド・データソースの例とネイティブ・データソースの例を示します。

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" /> 
SQLServerのネイティブ・データソース
<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>

レガシー構成

レガシー・データソース構成を使用する際には、次の事項を考慮する必要があります。

既存のデータソースの変換

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


注意

  • ORMIポートを指定する場合は、OC4Jが稼働している必要があります。OC4Jが稼働していない場合は、admin.jarコマンドラインからORMI URLを除外する必要があります。

  • ORMIポートを指定しない場合には、OC4Jが稼働しているかどうかにかかわらず、admin.jarコマンドを使用できます。

  • admin.jarユーティリティを使用できるのは、スタンドアロンOC4J環境のみです。このユーティリティはOracle Application Server環境にインストールされますが、OPMN管理環境では使用できません。

  • 新しいadmin_client.jarユーティリティは、スタンドアロン環境でも管理対象のOracle Application Server環境でも使用できます。ただし、admin_client.jarユーティリティでは、data-sources.xmlファイルは変換されません。

 

アプリケーションと新しいdata-sources.xmlファイル間の整合性の確認

手動または自動での変換後、新しいdata-sources.xmlファイルを開いて調査し、アプリケーションと新しいファイルとの間に、データソースの参照に使用されるJNDIロケーションの整合性があることを確認します。新しいファイルには使用されないデータソース定義が含まれている場合があるので、この確認を行うことをお薦めします。

これは、古い形式で複数のロケーション属性(locationejb-location、xa-locationなど)が使用されていることが原因です。新しい形式への変換により、古いdata-sources.xmlファイルに指定されているそれぞれのロケーション属性に対応する別のデータソースが、新しいdata-sources.xmlファイルに作成されます。多くの場合、クライアント・アプリケーションでは、locationまたはejb-location属性で定義されたデータソースのみが使用されます。ただし、これは保証されているわけではありません。そのため、変換されたdata-sources.xmlにはアプリケーションで使用されない定義が含まれますが、ファイルから削除できます。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引