ヘッダーをスキップ
Oracle® Data Provider for .NET開発者ガイド
11g リリース2 (11.2.0.4)
B66456-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

Oracle Databaseへの接続

Oracle Data Provider for .NETは、ユーザー名とパスワード、Windowsのネイティブ認証、Kerberos、Secure Sockets Layer(SSL)の使用など、多くの方法でOracle Databaseに接続できます。この項では、OracleConnectionプロバイダ固有の機能について説明します。内容は次のとおりです。

接続文字列属性

表3-1は、サポートされている接続文字列属性のリストです。

表3-1 サポートされている接続文字列属性

接続文字列属性 説明 デフォルト値

Connection Lifetime

接続の最大存続期間(秒)。

0

Connection Timeout

プールから使用可能な接続を待機する最大時間(秒)。

15

Context Connection

trueに設定した場合、暗黙的なデータベース接続が戻されます。

.NETストアド・プロシージャでのみサポートされています。

false

Data Source

接続するデータベースを識別するOracle Netサービス名、接続記述子または簡易接続ネーミング。

空の文字列

DBA Privilege

管理者権限:SYSDBAまたはSYSOPER

空の文字列

Decr Pool Size

未使用の確立済接続量が過剰となり、クローズされる接続数。

1

Enlist

COM+トランザクションまたはSystem.Transactionsのコンテキストでの接続の登録動作と機能を制御します。

true

HA Events

ODP.NET接続プールを使用して、Oracle RACサービス、サービス・メンバー、データベースまたはノードの停止時に、プールから接続を事前に削除できます。Oracle RAC、Data Guardまたは単一データベースのインスタンスで動作します。

false

Load Balancing

ODP.NET接続プールを使用して、ロード・バランシング・アドバイザリおよびサービスの目的に基づき、Oracle RACインスタンス間の作業要求のバランスを調整できます。

false

Incr Pool Size

プール内のすべての接続が使用された場合に作成される新しい接続の数。

5

Max Pool Size

プール内の接続の最大数。

100

Metadata Pooling

メタデータ情報をキャッシュします。

True

Min Pool Size

プール内の接続の最小数。

1

Password

User Idにより指定されたユーザーのパスワード。

空の文字列

Persist Security Info

接続文字列でのパスワード検索。

false

Pooling

接続プーリング。

true

Promotable Transaction

トランザクションがその存続中にローカルまたは分散かどうかを示します。

promotable

Proxy User Id

プロキシ・ユーザーのユーザー名。

空の文字列

Proxy Password

プロキシ・ユーザーのパスワード。

空の文字列

Self Tuning

接続の自動チューニングを有効化または無効化します。

true

Statement Cache Purge

接続がプールに戻るときの文キャッシュの消去。

false

Statement Cache Size

文キャッシングの有効化と、キャッシュ・サイズ、つまりキャッシュ可能な文の最大数。

0

User Id

Oracleユーザー名。

空の文字列

Validate Connection

プールから発生した接続の検証。

false


次の例は、Oracle Databaseへの接続に接続文字列属性を使用します。

// C#
 
using System;
using Oracle.DataAccess.Client; 
 
class ConnectionSample
{
  static void Main()
  {
    OracleConnection con = new OracleConnection();
 
    //using connection string attributes to connect to Oracle Database
    con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle";
    con.Open();
    Console.WriteLine("Connected to Oracle" + con.ServerVersion);
    
    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();
    Console.WriteLine("Disconnected");
  }
}
 

関連項目:


データ・ソース属性の指定

この項では、データ・ソース属性を指定する複数の方法について説明します。

次の例は、tnsnames.oraファイル内のsalesというTNS別名にマップされた接続記述子を示しています。

sales=
 (DESCRIPTION= 
  (ADDRESS= (PROTOCOL=tcp)(HOST=sales-server)(PORT=1521))
  (CONNECT_DATA= 
     (SERVICE_NAME=sales.us.acme.com)))

TNS別名の使用

TNS別名を使用してscott/tigerとして接続するには、有効な接続は次のようになります。

"user id=scott;password=tiger;data source=sales";

接続記述子の使用

ODP.NETでは、アプリケーションはtnsnames.oraファイルを使用せずに接続することもできます。そのためには、接続記述子全体を"data source"として使用できます。

接続文字列は次のようになります。

"user id=scott;password=tiger;data source=" + 
     "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)" + 
     "(HOST=sales-server)(PORT=1521))(CONNECT_DATA="+
     "(SERVICE_NAME=sales.us.acme.com)))"

簡易接続ネーミング・メソッドの使用

簡易接続ネーミング・メソッドを使用すると、クライアントは構成を行わずにデータベースに接続できます。

簡易接続ネーミング・メソッドを使用する前に、sqlnet.oraファイルのNAMES.DIRECTORY_PATHパラメータにより、EZCONNECTが次のように指定されていることを確認します。

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

これが有効になっていると、ODP.NETにより、アプリケーションでは"Data Source"属性を次の書式で指定できます。

//host:[port]/[service_name]

同じ例を使用して、有効な接続文字列を次に示します。

"user id=scott;password=tiger;data source=//sales-server:1521/sales.us.acme.com"
"user id=scott;password=tiger;data source=//sales-server/sales.us.acme.com" 
"user id=scott;password=tiger;data source=sales-server/sales.us.acme.com"

ポート番号が指定されていない場合、デフォルトで1521が使用されます。


関連項目:

簡易接続ネーミング・メソッドの使用の項に関する詳細および要件は、Oracle Net Services管理者ガイドを参照

接続プーリング

ODP.NET接続プーリングは、Pooling接続文字列属性を使用して有効化または無効化できます。デフォルトでは、接続プーリングは有効です。次に、接続プーリング・サービスの動作を制御するConnectionString属性を示します。

  • Connection Lifetime

  • Connection Timeout

  • Decr Pool Size

  • HA Events

  • Incr Pool Size

  • Load Balancing

  • Max Pool Size

  • Min Pool Size

  • Pooling

  • Validate Connection

接続プーリングの例

次の例は、接続プーリングに関連するConnectionString属性を使用して、接続をオープンします。

// C#
 
using System;
using Oracle.DataAccess.Client; 
 
 
class ConnectionPoolingSample
{
  static void Main()
  {
    OracleConnection con = new OracleConnection();
 
    //Open a connection using ConnectionString attributes
    //related to connection pooling.
    con.ConnectionString = 
      "User Id=scott;Password=tiger;Data Source=oracle;" + 
      "Min Pool Size=10;Connection Lifetime=120;Connection Timeout=60;" + 
      "Incr Pool Size=5; Decr Pool Size=2";
    con.Open();
    Console.WriteLine("Connection pool successfully created");
 
    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();
    Console.WriteLine("Connection is placed back into the pool.");
  }
}

接続プーリングの使用

接続プーリングが有効な場合(デフォルト)、OracleConnectionオブジェクトのOpenおよびCloseメソッドは、接続プーリング・サービスを暗黙的に使用します。これは、接続をプールしてアプリケーションに戻す処理を担当します。

接続プーリング・サービスは、プールを一意に識別するために、ConnectionStringプロパティを署名として使用して接続プールを作成します。

ConnectionStringプロパティの正確な属性値を持つプールが存在しない場合、接続プーリング・サービスは新しい接続プールを作成します。要求された署名を持つプールがすでに存在する場合、接続はそのプールからアプリケーションに戻されます。

接続プールが作成されると、接続プーリング・サービスは、ConnectionStringMin Pool Size属性で定義された接続数を最初に作成します。この接続数は、接続プールの接続プーリング・サービスによって常に保持されます。

これらの接続は、常にアプリケーションで使用され、またプール内でも使用できます。

ConnectionStringプロパティのIncr Pool Size属性には、接続プールでより多くの接続が必要になったときに、接続プーリング・サービスで作成される新しい接続の数を定義します。

アプリケーションが接続をクローズすると、接続プーリング・サービスは、接続存続期間がConnection Lifetime属性を超えているかどうかを調べます。超えている場合、接続プーリング・サービスは接続をクローズし、超えていない場合、接続は接続プールに戻ります。接続プーリング・サービスは、接続が接続プールに戻るときのみ、Connection Lifetimeを実行します。

ConnectionStringプロパティのMax Pool Size属性は、接続プールの接続の最大数を設定します。新しい接続が要求されたときに、有効な接続がなく、Max Pool Sizeに達している場合、接続プーリング・サービスは、Connection Timeout属性で定義された時間待機します。Connection Timeoutに達していても、プールに有効な接続がない場合、接続プーリング・サービスは、接続プール要求がタイムアウトしたことを示す例外を呼び出します。

Validate Connection属性は、プールから発生する接続を検証します。この属性は、必要な場合にのみ使用してください。この属性により、データベースへのラウンドトリップが、各接続権をアプリケーションに付与する前に検証するためです。無効な接続が特殊な場合、開発者はValidate Connection属性を使用するのではなく、独自のイベント・ハンドラを作成して、新しい接続を取得および検証できます。通常は、これによりパフォーマンスが改善されます。

接続が使用されていない場合、接続プーリング・サービスは接続をクローズします。接続は3分ごとにクローズされます。ConnectionStringプロパティのDecr Pool Size属性は、接続プーリング・サービスに対して、3分ごとにクローズできる接続の最大数を指定します。

Oracle Data Provider for .NETリリース11.1.0.6.20以降では、接続文字列で"pooling=true"を設定して接続プーリングを有効化することにより(デフォルトで設定されます)、オペレーティング・システムの認証された接続もプールされます。

接続プールの管理

ODP.NET接続プール管理は、ODP.NETアプリケーションに関する明示的な接続プール管理を提供します。アプリケーションは接続プール内の接続を明示的にクリアできます。

接続プール管理を使用すると、アプリケーションは次を実行できます。


注意:

これらのAPIは、.NETストアド・プロシージャではサポートされません。

  • ClearPoolメソッドを使用して接続プールから接続をクリアします。

  • ClearAllPoolsメソッドを使用して、アプリケーション・ドメイン内のすべての接続プール内の接続をクリアします。

接続がプールからクリアされると、ODP.NETは、少なくとも接続数以上が接続文字列のMin Pool Sizeに設定されている新規接続をプールに再移入します。新規接続の場合、必ずしもプールに有効な接続があるとはかぎりません。たとえば、ClearPoolまたはClearAllPoolsがコールされてデータベース・サーバーが停止すると、新規接続が作成されますが、後でデータベースが起動された場合にデータベースへの接続ができないため、これらの新規接続は無効になります。

データベースへの有効な接続が再作成されるまではClearPoolおよびClearAllPoolsをコールしないでください。.NETの開発者は、有効なデータベース接続が作成されているかどうかを常に確認し、接続が確認された場合にClearPoolまたはClearAllPoolsをコールするプログラムを作成できます。

接続プール・パフォーマンス・カウンタ

Oracle Data Provider for .NETのインストールにより、ターゲット・システムにパフォーマンス・カウンタのセットが作成されます。これらのパフォーマンス・カウンタはODP.NETにより、各ODP.NETクライアント・アプリケーションに公開されます。また、Windowsパフォーマンス・モニター(Perfmon)を使用して確認できます。

Perfmonでは、管理者はODP.NETカウンタをパフォーマンス・モニター・グラフに追加できます。ODP.NETパフォーマンス・カウンタは、Oracle Data Provider for .NETというカテゴリ名で公開されます。管理者は、Oracle Data Provider for .NETカテゴリを選択した後で、監視するODP.NETカウンタを選択できます。

ODP.NETパフォーマンス・カウンタは、デフォルトでは有効になっていないため、監視する前に、管理者が目的のカウンタを有効にする必要があります。また、Perfmonを使用して監視しようとする場合は、1つ以上のODP.NETインスタンスがアクティブに実行されている必要があります。

Oracle Data Provider for .NETは、レジストリ・エントリを使用して接続プーリングのパフォーマンス・カウンタの公開を有効または無効にします。

表3-2は、有効なレジストリ値を持つ接続プーリングに対して使用されるパフォーマンス・カウンタを示します。

表3-2 接続プーリングのパフォーマンス・カウンタ

パフォーマンス・カウンタ 有効な値 説明

なし

0

無効(デフォルト)

HardConnectsPerSecond

1

Oracle Databaseで毎秒確立されるセッション数。

HardDisconnectsPerSecond

2

Oracle Databaseから毎秒切断されるセッション数。

SoftConnectsPerSecond

4

接続プールから毎秒確立されるアクティブな接続数。

SoftDisconnectsPerSecond

8

接続プールから毎秒戻されるアクティブな接続数。

NumberOfActiveConnectionPools

16

アクティブな接続プールの合計数。

NumberOfInactiveConnectionPools

32

非アクティブな接続プール数。

NumberOfActiveConnections

64

使用中の接続の合計数。

NumberOfFreeConnections

128

すべての接続プールで使用可能な接続の合計数。

NumberOfPooledConnections

256

プールされているアクティブな接続の数。

NumberOfNonPooledConnections

512

プールされていないアクティブな接続の数。

NumberOfReclaimedConnections

1024

暗黙的にガベージ・コレクションに入った接続数。

NumberOfStasisConnections

2048

まもなくプールで利用可能になる接続数。ユーザーはこれらの接続をクローズしましたが、使用可能な接続としてプールに戻される前の、トランザクション完了などのアクション待ちになっています。


パフォーマンス・カウンタの公開

パフォーマンス・カウンタの公開を個別に有効または無効にするには、タイプREG_SZのレジストリ値PerformanceCountersを使用します。このレジストリ値は次のようになります。

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\Assembly_Version

Assembly_Versionは、Oracle.DataAccess.dllの完全なアセンブリ・バージョン番号です。

複数のパフォーマンス・カウンタは、有効な値を追加することで取得できます。たとえば、PerformanceCountersが3に設定されている場合、HardConnectsPerSecondおよびHardDisconnectsPerSecondは有効になります。

app.configエントリを使用したパフォーマンス・カウンタの設定

app.configエントリを使用して、パフォーマンス・カウンタを設定できます。app.configエントリはレジストリ値の設定よりも優先されるため、特定のアプリケーションに使用できます。

app.configエントリは、次の例のように名前/値ペアを使用します。

<configuration>
  <oracle.dataaccess.client>
  <settings>
    <add name="PerformanceCounters"
         value="3"/>
  </settings>
  </oracle.dataaccess.client>
</configuration>

パフォーマンス・カウンタのインスタンス名

パフォーマンス・カウンタはインスタンス単位で公開され、つまり、プロセスごとに異なるパフォーマンス・カウンタの値が公開されます。インスタンス名はAppDomain名、AppDomain IdおよびProcess Idに基づいており、次の書式で表示されます。

AppDomain_Name[Process Id, AppDomain Id]

たとえば、プロセス名App1.exeがデフォルトappdomainのODP.NET 2.xを使用し、そのプロセスIDが234の場合、インスタンス名はApp1.exe [234, 1]になります。

エディションベースの再定義

エディションベースの再定義を使用すると、アプリケーションが使用中であってもそのデータベース・コンポーネントをアップグレードできます。このため、アプリケーションの停止時間を最小化あるいは排除することができます。


関連項目:

エディションの詳細は、『Oracle Database管理者ガイド』および『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください

Oracle Database 11.2以上で使用している場合、ODP.NET 11gリリース2(11.2.0.1)以上では、デプロイメント時のエディションの指定がサポートされています。アプリケーションは、レジストリまたは構成ファイルを使用して、デプロイメント時にエディションを指定できます。

アプリケーションは、タイプREG_SZの次のレジストリ・エントリを作成できます。

HKLM\Software\Oracle\ODP.NET\version\Edition

ここで、versionはODP.NETのバージョン、Editionはエディションの有効な文字列値です。

アプリケーションは、かわりにweb.configまたはapplication.config構成ファイルを使用して、デプロイメント時にエディションを指定できます。machine.config構成ファイルを使用すると、特定のバージョンの.NET frameworkを使用するすべてのアプリケーションに対してエディションを指定できます。

次の例では、.NET 2.0、3.0および3.5の構成ファイルでエディションがE1に設定されます。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <oracle.dataaccess.client>
  <settings>
   <add name="Edition" value="E1"/>
  </settings>
 </oracle.dataaccess.client>
</configuration>

注意:

ODP.NETでサポートされるのは、エディションのデプロイメント時の構成のみです。

ODP.NETでは、プロセスの存続期間中にALTER SESSION文を使用してエディションを変更することはサポートされていません。


Oracle Real Application Clusters(RAC)データベースへの接続

この項では、Oracle Real Application Clusters(Oracle RAC)データベースでの接続と接続プーリングの最適化やその他の観点について説明します。Oracle RACとは、Oracleデータベースでグリッド化を可能にするテクノロジで、クラスタ内のノードでそれぞれ動作する複数のインスタンスからデータベースへアクセスする機能を提供します。

Oracle Real Application Clusters(Oracle RAC)およびData Guard Databaseでの接続

この項では、Oracle Real Application Clusters(Oracle RAC)およびData Guardデータベースでの接続と接続プーリングの最適化やその他の観点について説明します。Oracle RACとは、Oracleデータベースでグリッド化を可能にするテクノロジで、クラスタ内のノードでそれぞれ動作する複数のインスタンスからデータベースへアクセスする機能を提供します。Oracle Data Guardとは、プライマリ・データベースの障害に備えてセカンダリ・スタンバイ・データベースを保持することで、高可用性と障害時リカバリを可能にするテクノロジです。


関連項目:

Oracle Data Guard概要および管理

Oracle RACおよびOracle Data Guardの接続の最適化

Oracle Data Provider for .NETは、Oracle RACおよびData Guardを透過的にサポートしています。また、Oracle Data Provider for .NETの接続プーリング機能はリリース10.2以上のOracle RACまたはData Guardと連携して機能します。Oracle Data Provider for .NETは、ロード・バランシング・アドバイザリおよびサービスの目的に基づいてOracle RACインスタンス間の作業要求のバランスを調整することにより、Oracle RACデータベースの接続および接続プーリングを最適化します。さらに、Data Guardを使用していれば、ODP.NETの接続プールを有効にすることで、Oracle RACサービス、サービス・メンバー、ノードまたはデータベースの停止により切断された接続に関連付けられているリソースを事前に解放できます。

Oracle Data Provider for .NETは、次の機能を使用して、接続および接続プーリングをOracle RAC用に最適化します。

  • ランタイム接続ロード・バランシング

    ランタイム接続ロード・バランシングを有効にした場合:

    • ODP.NET接続プールは、ロード・バランシング・アドバイザリおよびサービスの目的に基づき、接続を分配します。

    • また、ODP.NET接続プールは、ロード・バランシング・アドバイザリおよびサービスの目的に基づき、サービスを提供する各サービス・メンバーに対して接続数のバランスを調整します。

    デフォルトでは、この機能は無効です。ランタイム接続ロード・バランシングを有効にするには、接続文字列に、"Load Balancing=true"を含めます。

    この機能は、"pooling=true"の場合にかぎり、Oracle RACデータベースに対してのみ使用できます。"Load Balancing=true"を設定し、シングルインスタンスのデータベースに対して接続を試行すると、「ORA-1031: 権限が不足しています」というエラーのOracleExceptionがスローされます。

    ランタイム接続ロード・バランシングを使用するには、特定のOracle RAC構成を設定する必要があります。詳細は、『Oracle Database Oracle ClusterwareおよびOracle Real Application Clusters管理およびデプロイメント・ガイド』を参照してください。ロード・バランシングにはOracle Net Serviceも構成する必要があります。詳細は、『Oracle Net Services管理者ガイド』を参照してください。

    次の例は、ランタイム接続ロード・バランシングを有効にする接続文字列です。

    "user id=scott;password=tiger;data source=erp;load balancing=true;"
    

    関連項目:


  • HAイベント

    HA(高可用性)イベントが有効の場合、Oracle RAC、Data Guardおよび単一のデータベースのインスタンスは、次のような動作をします。

    • ODP.NET接続プールでは、Oracle RACサービス、サービス・メンバー、ノードまたはデータベースの停止時に、プールから接続を事前に削除します。

    • 切断された接続を削除して、接続合計数が"min pool size"を下回った場合、ODP.NETは既存のOracleインスタンスへの接続を確立します。

    デフォルトでは、この機能は無効です。HAイベントを有効にするには、接続文字列に"HA Events=true"および"pooling=true"を含めます。


    注意:

    接続するデータベース・サービスは、AQ_HA_NOTIFICATIONSに対して設定する必要があります。詳細は、Oracle Database Oracle ClusterwareおよびOracle Real Application Clusters管理およびデプロイメント・ガイドを参照してください


    次の例は、HAイベントを有効にする接続文字列です。

    "user id=scott;password=tiger;data source=erp;HA events=true;"
    

    関連項目:


Oracle RACデータベースのプール・サイズ属性

シングルインスタンス・データベースに対して接続プールが作成された場合、プール・サイズ属性は単一のサービスに適用されます。同様に、Oracle RACデータベースに対して接続プールが作成された場合、プール・サイズ属性はサービスに適用され、サービス・メンバーには適用されません。たとえば、Min Pool SizeNに設定されている場合、ODP.NETでは各サービス・メンバーに対してN個の接続を作成しません。かわりに、サービス全体に対して最小N個の接続を作成し、サービス・メンバー間でN個の接続が分散されます。

次のプール・サイズ接続文字列属性が、サービスに適用されます。

  • Min Pool Size

  • Max Pool Size

  • Incr Pool Size

  • Decr Pool Size

オペレーティング・システム認証

Oracle Databaseは、Windowsのユーザー・ログイン資格証明を使用してデータベース・ユーザーを認証できます。Windowsのユーザー・ログイン資格証明を使用して接続をオープンするには、User Id接続文字列属性をスラッシュ(/)に設定する必要があります。Password属性を指定しても無視されます。


注意:

オペレーティング・システム認証は、.NETストアド・プロシージャではサポートされません。

Oracle Data Provider for .NETリリース11.1.0.6.20以降では、オペレーティング・システム認証を使用した接続を含めたすべての接続をプールできます。プーリングが有効になっている間は、デフォルトで接続はプールされ、構成は必要ありません。

オペレーティング・システム認証の使用例を次に示します。

/* Create an OS-authenticated user in the database
   Assume init.ora has OS_AUTHENT_PREFIX set to "" and <OS_USER>
   is any valid OS or DOMAIN user.
 
     create user <OS_USER> identified externally;
     grant connect, resource to <OS_USER>;
 
   Login through OS Authentication and execute the sample.  See Oracle 
   documentation for details on how to configure an OS-Authenticated user
*/
 
// C#
 
using System;
using Oracle.DataAccess.Client; 
 
class OSAuthenticationSample
{
  static void Main()
  {
    OracleConnection con = new OracleConnection();
 
    //Establish connection using OS Authentication   
    con.ConnectionString = "User Id=/;Data Source=oracle;";
    con.Open();
    Console.WriteLine("Connected to Oracle" + con.ServerVersion);
 
    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();
    Console.WriteLine("Disconnected");
  }
}

関連項目:

Windowsのユーザー・ログイン資格証明を使用してデータベース・ユーザーを認証するようにOracleデータベースを設定する方法の詳細は、Oracle Databaseプラットフォーム・ガイドを参照

特権接続

データベース管理者は、SYSDBAまたはSYSOPER権限を使用してOracle Databaseにアクセスできます。これは、ConnectionStringプロパティのDBA Privilege属性によって実行されます。

次の例では、SYSDBAとしてscott/tigerに接続します。

// C#
 
using System;
using Oracle.DataAccess.Client; 
 
class PrivilegedConnectionSample
{
  static void Main()
  {
    OracleConnection con = new OracleConnection();
 
    //Connect scott/tiger as SYSDBA   
    con.ConnectionString = "User Id=scott;Password=tiger;" + 
      "DBA Privilege=SYSDBA;Data Source=oracle;";
    con.Open();
    Console.WriteLine("Connected to Oracle" + con.ServerVersion);
 
    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();
    Console.WriteLine("Disconnected");
  }
}

関連項目:

データベースの特権接続の詳細は、「サポートされている接続文字列属性」の「DBA Privilege」を参照

パスワードの失効

ユーザーのパスワードを失効させることができます。ODP.NETは、新規パスワードで接続をオープンする新しいメソッドOpenWithNewPasswordを指定することで、アプリケーションにパスワードの失効を処理させることができます。

次のコードは、pantherの新規パスワードで接続するために、OracleConnection OpenWithNewPasswordメソッドを使用しています。

/* Database Setup
connect / as sysdba;
drop user testexpire cascade;
-- create user "testexpire" with password "testexpire"
grant connect , resource to testexpire identified by testexpire; 
alter user testexpire password expire;
*/
 
 
// C#
 
using System;
using Oracle.DataAccess.Client; 
 
class PasswordExpirationSample
{
  static void Main()
  {
    OracleConnection con = new OracleConnection();
 
    try
    {
      con.ConnectionString = 
        "User Id=testexpire;Password=testexpire;Data Source=oracle";
      con.Open();
      Console.WriteLine("Connected to Oracle" + con.ServerVersion);
    }
    catch (OracleException ex)
    {
      Console.WriteLine(ex.Message);
 
      //check the error number 
      //ORA-28001 : the password has expired
      if (ex.Number == 28001)
      {
        Console.WriteLine("\nChanging password to panther");
        con.OpenWithNewPassword("panther");
        Console.WriteLine("Connected with new password.");
      }
    }
    finally
    {
      // Close and Dispose OracleConnection object
      con.Close();
      con.Dispose();
      Console.WriteLine("Disconnected");
    }
  }
}

注意:

  • OpenWithNewPasswordは、パスワードを変更するためではなく、ユーザーのパスワードが失効した場合のみ使用してください。

  • 接続プーリングが有効な場合、OpenWithNewPasswordメソッドを呼び出すと接続プールがクリアされます。その結果、古いパスワードで作成されたアイドル接続はすべてクローズされます。


プロキシ認証

データベースの設定が正しければ、データベース・ユーザーのアイデンティティおよび特権を保持し、ユーザーのかわりに監査処理を実行して、プロキシ認証により、中間層アプリケーションでセキュリティを制御できるようになります。そのためには、(実在の)データベース・ユーザー(複数可)のかわりにデータベースに接続し、認証を受けるプロキシ・データベース・ユーザーを作成および使用します。

さらに、プロキシ認証をすると、接続プーリングのスケーラビリティを強化できます。接続プーリングをプロキシ認証と組み合せて使用すると、プロキシ認証済の接続を、実在する複数のユーザー間で共有できます。これは、プロキシに対して確立済の接続およびセッションのみがキャッシュされるためです。プロキシ認証済の接続を要求すると、セッションが実際のユーザーに対して追加作成されますが、このプロキシ認証済接続がプール内に戻されると、追加作成されたセッションは廃棄されます。この設計により、セキュリティを犠牲にすることなくアプリケーションのスケーラビリティを強化できます。

ODP.NETアプリケーションでプロキシ認証を使用するには、接続文字列に、"Proxy User Id"属性および"Proxy Password"属性を設定します。実在のユーザーは、"User Id"属性で指定します。オプションで、"Password"接続文字列属性を介して実在のユーザーのパスワードを指定すると、セキュリティがさらに強化されます。プロキシ認証とともに分散トランザクションを使用する場合は、実際のユーザーのパスワードがオプションでなくなるため、パスワードを指定する必要があります。

ODP.NETプロキシ認証の使用例を次に示します。

/*  Log on as DBA (SYS or SYSTEM) that has CREATE USER privilege.
    Create a proxy user and modified scott to allow proxy connection.
  
     create user appserver identified by eagle;
     grant connect, resource to appserver;
     alter user scott grant connect through appserver;
*/
 
// C#
 
using System;
using Oracle.DataAccess.Client; 
 
class ProxyAuthenticationSample
{
  static void Main()
  {
    OracleConnection con = new OracleConnection();
 
    // Connecting using proxy authentication
    con.ConnectionString = "User Id=scott;Password=tiger;" + 
      "Data Source=oracle;Proxy User Id=appserver;Proxy Password=eagle; ";
    con.Open();
    Console.WriteLine("Connected to Oracle" + con.ServerVersion);
 
    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();
    Console.WriteLine("Disconnected");
  }
}

関連項目:

  • プロキシ・ユーザーを使用して中間層サーバーを設計する方法の詳細は、Oracle Databaseアドバンスト・アプリケーション開発者ガイドを参照

  • ALTER USER文のプロキシ句の説明および構文は、Oracle Database SQLリファレンスを参照

  • Oracle Databaseセキュリティ・ガイドの複数層環境における標準監査に関する項


動的な分散トランザクション登録

OracleConnectionオブジェクトのEnlistDistributedTransactionを使用して分散トランザクションに動的に登録するアプリケーションでは、"enlist"接続文字列属性の値を"dynamic"または"true"に設定する必要があります。"enlist=true"の場合、COM+トランザクションまたはSystem.Transactionsのコンテキスト内でOracleConnectionオブジェクトに対してOpenメソッドがコールされると、接続がトランザクションに登録されます。そうでない場合、OracleConnectionオブジェクトは分散トランザクションに登録されませんが、後でEnlistDistributedTransactionまたはEnlistTransactionメソッドを使用して明示的に登録できます。"enlist=false"の場合は、接続をトランザクションに登録できません。

"Enlist=dynamic"を使用して再構築できないアプリケーションの場合は、タイプREG_SZのレジストリ文字列値DynamicEnlistmentHKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\Assembly_Versionに作成し、1に設定する必要があります。このAssembly_Versionは、Oracle.DataAccess.dllの完全なアセンブリ・バージョン番号です。ODP.NETが適切にインストールされている場合は、同じODP.NETキーの下にStatementCacheSizeTraceFileNameなどのレジストリ文字列値がすでに存在します。動的登録は、XML構成ファイルを使用して構成することもできます。詳細は、「Oracle Data Provider for .NETの構成」を参照してください。DynamicEnlistmentレジストリ・キーが0に設定されている場合(または、レジストリ・エントリが存在しない場合)は、アプリケーションに影響を与えません。ただし、DynamicEnlistment1に設定されている場合、"Enlist=false""Enlist=dynamic"と同様に処理され、アプリケーションは、コードを変更せずに、EnlistDistributedTransactionメソッドを使用して正常に登録できます。DynamicEnlistment1に設定しても、接続文字列が"Enlist=true"または"Enlist=dynamic"の OracleConnectionオブジェクトには影響を与えません。

クライアント識別子とエンドツーエンド・トレース

クライアント識別子は、Oracleアプリケーションのコンテキスト・ネームスペースUSERENVから事前に定義された属性です。ユーザーのアイデンティティのトラッキングが可能であるという点で、プロキシ認証に似ています。ただし、プロキシ認証では、2つのセッション(プロキシ・ユーザー用とエンド・ユーザー用)を作成する必要がありません。さらに、クライアント識別子は、データベース・ユーザーである必要はありません。任意の文字列に設定できます。最も重要な点は、クライアント識別子を使用することで、ODP.NET開発者がApplication ContextおよびOracle Label Securityを使用してOracle Virtual Private Database(VPD)をより簡単に構成できることです。クライアント識別子を設定するため、接続をオープンしてから、ODP.NETアプリケーションでOracleConnectionオブジェクトにClientIdプロパティを設定できます。接続プーリングが有効な場合、プールに接続が戻されると、常にClientIdnullにリセットされます。

クライアント識別子は、エンドツーエンド・アプリケーション・トレースにも使用できます。エンドツーエンド・トレースは、複数層環境のパフォーマンス上の問題の診断プロセスを単純化します。複数層環境では、エンド・クライアントからの要求は中間層で別のデータベース・セッションにルーティングされるため、異なるデータベース・セッションを越えてクライアントを追跡することは困難になります。エンドツーエンド・トレースでは、クライアント識別子を使用して、データベース・サーバーに対するすべての層から特定のエンドクライアントを一意にトレースします。

ODP.NETでは、OracleConnectionオブジェクトの書込み専用プロパティであるActionName、ClientIdClientInfo、およびModuleNameが公開されています。これらのプロパティは、次のエンドツーエンドのトレース属性に対応しています。

  • Action - モジュールのINSERT操作やUPDATE操作などのアクションを指定します。

  • ClientId - HR.HRなどのログオンIDに基づいてエンド・ユーザーを指定します。

  • クライアント情報 - ユーザー/セッション情報を指定します。

  • Module - アプリケーションのAccounts ReceivableやGeneral Ledgerなどの機能ブロックを指定します。


関連項目:

  • 「OracleConnectionプロパティ」

  • Oracle Databaseパフォーマンス・チューニング・ガイドの「エンドツーエンド・アプリケーション・トレース」

  • 『Oracle Databaseセキュリティ・ガイド』


透過的アプリケーション・フェイルオーバー(TAF)コールバックのサポート

透過的アプリケーション・フェイルオーバー(TAF)は、高可用性を提供するOracle Databaseの機能です。


注意:

TAFは、.NETストアド・プロシージャではサポートされません。

TAFを使用すると、接続が継続していれば、別のデータベース・インスタンスに自動的に再接続できます。アクティブなトランザクションはロールバックされますが、別のノードを経由した新しいデータベース接続は、元の接続と同一です。これは、接続が失敗した方法に関係なく当てはまります。

TAFを使用すると、アプリケーションを提供するインスタンスが1つ残っているかぎり、クライアントで接続が失われることはありません。データベース管理者は、インスタンスで実行されるアプリケーションを制御して、各アプリケーションのフェイルオーバー命令も作成します。

別のデータベースにセッションがフェイルオーバーした場合、元のセッションで最初に設定されていたNLS設定は、新しいセッションに引き継がれません。したがって、これらのNLS設定は、アプリケーション側で新しいセッションに設定する必要があります。

TAF通知

フェイルオーバーによる遅延を考慮して、アプリケーションではTAFコールバックによる通知を必要とします。ODP.NETは、OracleConnectionオブジェクトのFailoverイベントによるTAFコールバック機能をサポートしています。これにより、フェイルオーバーが発生したときは常にアプリケーションに通知されます。TAFコールバックを受信するには、Failoverイベントにイベント・ハンドラ関数を登録する必要があります。

フェイルオーバーが発生した場合

フェイルオーバーが発生すると、Failoverイベントが発生し、別のOracleインスタンスに接続を再確立する過程で、イベント・ハンドラが複数回起動されます。

イベント・ハンドラの最初のコールは、Oracle Databaseがインスタンス接続の損失を最初に検出したときに行われます。これにより、アプリケーションはフェイルオーバーの次の遅延に応じて動作します。

フェイルオーバーが成功した場合、接続が再確立されて使用可能になったときにFailoverイベントが発生します。この時点で、アプリケーションはOracleGlobalizationセッション設定を再同期化して、フェイルオーバーが発生したことをアプリケーション・ユーザーに通知できます。

フェイルオーバーが失敗した場合、フェイルオーバーが発生しなかったことをアプリケーションに通知するために、Failoverイベントが発生します。

アプリケーションは、イベント・ハンドラに渡されるOracleFailoverEventArgsオブジェクトをチェックすることで、フェイルオーバーが成功したかどうかを判断できます。

フェイルオーバーのイベント・ハンドラの登録

次のコード例は、OnFailoverと呼ばれるイベント・ハンドラ・メソッドを登録します。

// C#
 
using System;
using Oracle.DataAccess.Client; 
 
class TAFCallBackSample
{
  public static FailoverReturnCode OnFailover(object sender, 
                                              OracleFailoverEventArgs eventArgs)
  {
    switch (eventArgs.FailoverEvent)
    {
      case FailoverEvent.Begin :
        Console.WriteLine(
          " \nFailover Begin - Failing Over ... Please standby \n");
        Console.WriteLine(
          " Failover type was found to be " + eventArgs.FailoverType);
        break;
 
      case FailoverEvent.Abort :
        Console.WriteLine(" Failover aborted. Failover will not take place.\n");
        break;
 
      case FailoverEvent.End :
        Console.WriteLine(" Failover ended ...resuming services\n");
        break;
 
      case FailoverEvent.Reauth :
        Console.WriteLine(" Failed over user. Resuming services\n");
        break;
 
      case FailoverEvent.Error :
        Console.WriteLine(" Failover error gotten. Sleeping...\n");
        return FailoverReturnCode.Retry;
 
      default :
        Console.WriteLine("Bad Failover Event: %d.\n", eventArgs.FailoverEvent);
        break;
    }
    return FailoverReturnCode.Success;
  } /* OnFailover */
 
  static void Main()
  {
    OracleConnection con = new OracleConnection();
 
    con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle;";
    con.Open();
    con.Failover += new OracleFailoverEventHandler(OnFailover);
    Console.WriteLine("Event Handler is successfully registered");
 
    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();
  }
}

Failoverイベントは、1つのイベント・ハンドラのみを起動します。Failoverイベントに複数のFailoverイベント・ハンドラが登録されていても、最後に登録されたイベント・ハンドラのみが起動されます。


注意:

フェイルオーバーが有効な環境では、分散トランザクションはサポートされません。