この項では、OracleConnection
プロバイダ固有の機能について説明します。項目は次のとおりです。
表3-1は、サポートされている接続文字列属性のリストです。
表3-1 サポートされている接続文字列属性
接続文字列属性 | 説明 | デフォルト値 |
---|---|---|
|
接続の最大存続期間(秒)。 |
|
|
プールから使用可能な接続を待機する最大時間(秒)。 |
|
|
.NETストアド・プロシージャでのみサポートされています。 |
|
|
接続するデータベースを識別するOracle Netサービス名、接続記述子または簡易接続ネーミング。 |
空の文字列 |
|
管理者権限: |
空の文字列 |
|
未使用の確立済接続量が過剰となり、クローズされる接続数。 |
|
|
COM+トランザクションまたは |
|
|
ODP.NET接続プールを使用して、Oracle RACサービス、サービス・メンバー、データベースまたはノードの停止時に、プールから接続を事前に削除できます。RAC、Data Guardまたは単一データベースのインスタンスで動作します。 |
|
|
ODP.NET接続プールを使用して、ロード・バランシング・アドバイザリおよびサービスの目的に基づき、Oracle RACインスタンス間の作業要求のバランスを調整できます。 |
|
|
プール内のすべての接続が使用された場合に作成される新しい接続の数。 |
|
|
プール内の接続の最大数。 |
|
|
メタデータ情報をキャッシュします。 |
|
|
プール内の接続の最小数。 |
|
|
|
空の文字列 |
|
接続文字列でのパスワード検索。 |
|
|
接続プーリング。 |
|
|
トランザクションがその存続中にローカルまたは分散かどうかを示します。 |
promotable |
|
プロキシ・ユーザーのユーザー名。 |
空の文字列 |
|
プロキシ・ユーザーのパスワード。 |
空の文字列 |
|
接続がプールに戻るときの文キャッシュの消去。 |
|
|
文キャッシングの有効化と、キャッシュ・サイズ、つまりキャッシュ可能な文の最大数。 |
|
|
Oracleユーザー名。 |
空の文字列 |
|
プールから発生した接続の検証。 |
|
次の例は、Oracleデータベースへの接続に接続文字列属性を使用します。
// 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別名を使用して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
プロパティの正確な属性値を持つプールが存在しない場合、接続プーリング・サービスは新しい接続プールを作成します。要求された署名を持つプールがすでに存在する場合、接続はそのプールからアプリケーションに戻されます。
接続プールが作成されると、接続プーリング・サービスは、ConnectionString
のMin
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は、レジストリ・エントリを使用して接続プーリングのパフォーマンス・カウンタの公開を有効または無効にします。
表3-2は、有効なレジストリ値を持つ接続プーリングに対して使用されるパフォーマンス・カウンタを示します。
表3-2 接続プーリングのパフォーマンス・カウンタ
パフォーマンス・カウンタ | 有効な値 | 説明 |
---|---|---|
なし |
|
無効(デフォルト) |
|
|
Oracleデータベースで毎秒確立されるセッション数。 |
|
|
Oracleデータベースから毎秒切断されるセッション数。 |
|
|
接続プールから毎秒確立されるアクティブな接続数。 |
|
|
接続プールから毎秒戻されるアクティブな接続数。 |
|
|
アクティブな接続プールの合計数。 |
|
|
非アクティブな接続プール数。 |
|
|
使用中の接続の合計数。 |
|
|
すべての接続プールで使用可能な接続の合計数。 |
|
|
プールされているアクティブな接続の数。 |
|
|
プールされていないアクティブな接続の数。 |
|
|
暗黙的にガベージ・コレクションに入った接続数。 |
|
|
まもなくプールで利用可能になる接続数。ユーザーはこれらの接続をクローズしましたが、使用可能な接続としてプールに戻される前の、トランザクション完了などのアクション待ちになっています。 |
パフォーマンス・カウンタの公開を個別に有効または無効にするには、タイプ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
エントリは、次の例のように名前/値ペアを使用します。
<configuration> <oracle.dataaccess.client> <settings> <add name="PerformanceCounters" value="3"/> </settings> </oracle.dataaccess.client> </configuration>
パフォーマンス・カウンタはインスタンス単位で公開され、つまり、プロセスごとに異なるパフォーマンス・カウンタの値が公開されます。インスタンス名はAppDomain
名、AppDomain
Id
およびProcess
Id
に基づいており、次の書式で表示されます。
ODP.NET 2.x
AppDomain_Name[Process
Id,
AppDomain Id]
ODP.NET 1.x
AppDomain_Name[Process
Id
]
たとえば、プロセス名App1.exe
がデフォルトappdomain
のODP.NET 2.xを使用し、そのプロセスIDが234
の場合、インスタンス名はApp1.exe [234,
1]
になります。
この項では、Real Application Clusters(RAC)データベースでの接続および接続プーリングの最適化およびその他の観点について説明します。Oracle RACとは、Oracleデータベースでグリッド化を可能にするテクノロジで、クラスタ内のノードでそれぞれ動作する複数のインスタンスからデータベースへアクセスする機能を提供します。
Oracle Data Provider for .NETは、ロード・バランシング・アドバイザリおよびサービスの目的に基づいてOracle RACインスタンス間の作業要求のバランスを調整することにより、Oracle RACデータベースの接続および接続プーリングを最適化します。さらに、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"
を設定し、RAC以外のデータベースに対して接続を試行すると、「ORA-1031:
権限が不足しています
」というエラーのOracleException
がスローされます。
ランタイム接続ロード・バランシングを使用するには、特定の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"
を含めます。
注意: 接続するデータベース・サービスは、 |
次の例は、HAイベントを有効にする接続文字列です。
"user id=scott;password=tiger;data source=erp;HA events=true;"
関連項目:
|
非RACデータベースに対して接続プールが作成された場合、プール・サイズ属性は単一のサービスに適用されます。同様に、Oracle RACデータベースに対して接続プールが作成された場合、プール・サイズ属性はサービスに適用され、サービス・メンバーには適用されません。たとえば、Min
Pool
Size
がN
に設定されている場合、ODP.NETでは各サービス・メンバーに対してN
個の接続を作成しません。かわりに、サービス全体に対して最小N
個の接続を作成し、サービス・メンバー間でN
個の接続が分散されます。
次のプール・サイズ接続文字列属性が、サービスに適用されます。
Min
Pool
Size
Max
Pool
Size
Incr
Pool
Size
Decr
Pool
Size
Oracleデータベースは、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データベースにアクセスできます。これは、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"); } }
ユーザーのパスワードを失効させることができます。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 は、パスワードを変更するためではなく、ユーザーのパスワードが失効した場合のみ使用してください。 |
データベースの設定が正しければ、データベース・ユーザーのアイデンティティおよび特権を保持し、ユーザーのかわりに監査処理を実行して、プロキシ認証により、中間層アプリケーションでセキュリティを制御できるようになります。そのためには、(実在の)データベース・ユーザー(複数可)のかわりにデータベースに接続し、認証を受けるプロキシ・データベース・ユーザーを作成および使用します。
さらに、プロキシ認証をすると、接続プーリングのスケーラビリティを強化できます。接続プーリングをプロキシ認証と組み合せて使用すると、プロキシ認証済の接続を、実在する複数のユーザー間で共有できます。これは、プロキシに対して確立済の接続およびセッションのみがキャッシュされるためです。プロキシ認証済の接続を要求すると、セッションが実際のユーザーに対して追加作成されますが、このプロキシ認証済接続がプール内に戻されると、追加作成されたセッションは廃棄されます。この設計により、セキュリティを犠牲にすることなくアプリケーションのスケーラビリティを強化できます。
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"); } }
関連項目:
|
OracleConnection
オブジェクトのEnlistDistributedTransaction
またはEnlistTransaction
メソッドを使用して分散トランザクションに動的に登録するアプリケーションでは、"enlist"
接続文字列属性の値を"dynamic"
または"true"
に設定する必要があります。"enlist=true"
の場合、COM+トランザクションまたはSystem.Transactions
のコンテキスト内でOracleConnection
オブジェクトに対してOpen
メソッドがコールされると、接続がトランザクションに登録されます。そうでない場合、OracleConnection
オブジェクトは分散トランザクションに登録されませんが、後でEnlistDistributedTransaction
またはEnlistTransaction
メソッドを使用して明示的に登録できます。"enlist=false"
の場合は、接続をトランザクションに登録できません。
"Enlist=dynamic"
を使用して再構築できないアプリケーションの場合は、タイプREG_SZ
のレジストリ文字列値DynamicEnlistment
をHKEY_LOCAL_MACHINE¥SOFTWARE¥ORACLE¥ODP.NET¥
Assembly
_Version
に作成し、1
に設定する必要があります。このAssembly_Version
は、Oracle.DataAccess.dll
の完全なアセンブリ・バージョン番号です。ODP.NETが適切にインストールされている場合は、同じODP.NETキーの下にStatementCacheSize
、TraceFileName
などのレジストリ文字列値がすでに存在します。動的登録は、XML構成ファイルを使用して構成することもできます。詳細は、「ODP.NET構成」を参照してください。DynamicEnlistment
レジストリ・キーが0
に設定されている場合(または、レジストリ・エントリが存在しない場合)は、アプリケーションに影響を与えません。ただし、DynamicEnlistment
が1
に設定されている場合、"Enlist=false"
は"Enlist=dynamic"
と同様に処理され、アプリケーションは、コードを変更せずに、EnlistDistributedTransaction
メソッドを使用して正常に登録できます。DynamicEnlistment
を1
に設定しても、接続文字列が"Enlist=true"
または"Enlist=dynamic"の
OracleConnection
オブジェクトには影響を与えません。
クライアント識別子は、Oracleアプリケーションのコンテキスト・ネームスペースUSERENV
から事前に定義された属性です。ユーザーのアイデンティティのトラッキングが可能であるという点で、プロキシ認証に似ています。ただし、プロキシ認証では、2つのセッション(プロキシ・ユーザー用とエンド・ユーザー用)を作成する必要がありません。さらに、クライアント識別子は、データベース・ユーザーである必要はありません。任意の文字列に設定できます。最も重要な点は、クライアント識別子を使用することで、ODP.NET開発者がApplication ContextおよびOracle Label Securityを使用してOracle Virtual Private Database(VPD)をより簡単に構成できることです。クライアント識別子を設定するため、接続をオープンしてから、ODP.NETアプリケーションでOracleConnection
オブジェクトにClientId
プロパティを設定できます。接続プーリングが有効な場合、プールに接続が戻されると、常にClientId
はnull
にリセットされます。
ODP.NETは、OracleConnection
オブジェクト上でClientId
プロパティを公開します。ClientId
プロパティを内部で設定することでCLIENT_IDENTIFIER
属性がセッション上に設定されます。ClientId
プロパティをクリアするには、単にこれを""
またはstring.Empty
に設定します。ClientId
プロパティは書込み専用です。
透過的アプリケーション・フェイルオーバー(TAF)は、高可用性を提供するOracleデータベースの機能です。
注意: TAFは、.NETストアド・プロシージャではサポートされません。 |
TAFを使用すると、接続が継続していれば、別のデータベース・インスタンスに自動的に再接続できます。アクティブなトランザクションはロールバックされますが、別のノードを経由した新しいデータベース接続は、元の接続と同一です。これは、接続が失敗した方法に関係なく当てはまります。
TAFを使用すると、アプリケーションを提供するインスタンスが1つ残っているかぎり、クライアントで接続が失われることはありません。データベース管理者は、インスタンスで実行されるアプリケーションを制御して、各アプリケーションのフェイルオーバー命令も作成します。
別のデータベースにセッションがフェイルオーバーした場合、元のセッションで最初に設定されていたNLS設定は、新しいセッションに引き継がれません。したがって、これらのNLS設定は、アプリケーション側で新しいセッションに設定する必要があります。
フェイルオーバーによる遅延を考慮して、アプリケーションではTAFコールバックによる通知を必要とします。ODP.NETは、OracleConnection
オブジェクトのFailover
イベントによるTAFコールバック機能をサポートしています。これにより、フェイルオーバーが発生したときは常にアプリケーションに通知されます。TAFコールバックを受信するには、Failover
イベントにイベント・ハンドラ関数を登録する必要があります。
フェイルオーバーが発生すると、Failover
イベントが発生し、別のOracleインスタンスに接続を再確立する過程で、イベント・ハンドラが複数回起動されます。
イベント・ハンドラの最初のコールは、Oracleデータベースがインスタンス接続の損失を最初に検出したときに行われます。これにより、アプリケーションはフェイルオーバーの次の遅延に応じて動作します。
フェイルオーバーが成功した場合、接続が再確立されて使用可能になったときに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
イベント・ハンドラが登録されていても、最後に登録されたイベント・ハンドラのみが起動されます。
注意: フェイルオーバーが有効な環境では、分散トランザクションはサポートされません。 |