Oracle Data Provider for .NETは、ユーザー名とパスワード、Windowsネイティブ認証、KerberosおよびTransport Layer Security/Secure Sockets Layerなど様々な方法でOracle Databaseに接続できます。この項では、OracleConnectionプロバイダ固有の機能について説明します。内容は次のとおりです。
表3-2は、サポートされている接続文字列属性のリストです。
表3-2 サポートされている接続文字列属性
| 接続文字列属性 | 説明 | デフォルト値 |
|---|---|---|
|
|
接続の最小存続時間(秒)。 |
|
|
|
プールから使用可能な接続を待機する最小時間(秒)。 |
|
|
|
.NETストアド・プロシージャでのみサポートされています。 |
|
|
|
接続するデータベースを識別するOracle Netサービス名、接続記述子または簡易接続ネーミング。 |
空の文字列 |
|
|
管理者権限: |
空の文字列 |
|
|
未使用の確立済接続量が過剰となり、クローズされる接続数。 |
|
|
|
COM+トランザクションまたは |
|
|
|
ODP.NET接続プールを使用して、Oracleデータベース・サービス、サービス・メンバー、インスタンスまたはノードの停止時に、プールから接続を事前に削除できます。Oracle RAC、Data Guard、GoldenGateなどの単一インスタンスへのデプロイを含め、Oracle Global Data Servicesを扱います。 |
|
|
|
ODP.NET接続プールを使用して、ロード・バランシング・アドバイザリおよびサービスの目的に基づき、Oracleデータベース・インスタンス間の作業要求のバランスを調整できます。Oracle RAC、Active Data Guard、GoldenGateなどを含め、Oracle Global Data Servicesを扱います。 |
|
|
|
プール内のすべての接続が使用された場合に作成される新しい接続の数。 |
|
|
|
プール内の接続の最大数。 |
|
|
|
メタデータ情報をキャッシュします。 |
|
|
|
プール内の接続の最小数。 |
|
|
|
|
空の文字列 |
|
|
接続文字列でのパスワード検索。 |
|
|
|
接続プーリング。 |
|
|
|
トランザクションがその存続中にローカルまたは分散かどうかを示します。 |
promotable |
|
|
プロキシ・ユーザーのユーザー名。 |
空の文字列 |
|
|
プロキシ・ユーザーのパスワード。 |
空の文字列 |
|
|
接続の自動チューニングを有効化または無効化します。 |
|
|
|
接続がプールに戻るときの文キャッシュの消去。 |
|
|
|
文キャッシングの有効化と、キャッシュ・サイズ、つまりキャッシュ可能な文の最大数。 |
|
|
|
Oracleユーザー名。 |
空の文字列 |
|
|
プールから発生した接続の検証。 |
|
次の例は、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");
}
}
OracleConnectionStringBuilderクラスでは、エラーを起こしにくく、管理しやすい接続文字列を作成します。
このクラスを使用することによって、開発者は設定ファイルを使用した接続文字列の提供およびキー/値ペアによる動的な値の設定が可能です。設定ファイル・エントリの例は次のとおりです。
<configuration>
<connectionStrings>
<add name="Publications" providerName="Oracle.DataAccess.Client"
connectionString="User Id=scott;Password=tiger;Data Source=inst1" />
</connectionStrings>
</configuration>
接続文字列情報は、接続文字列名を指定して取得できます。この例ではPublicationsです。次に、providerNameに基づいて、そのプロバイダ用の適切なファクトリを取得できます。これにより、接続文字列を簡単に管理および変更できます。さらに、これによって接続文字列への文字列注入に対してより優れたセキュリティを提供します。
この項では、データ・ソース属性を指定する複数の方法について説明します。
次の例は、tnsnames.oraファイル内のsalesというTNS別名にマップされた接続記述子を示しています。
sales=
(DESCRIPTION=
(ADDRESS= (PROTOCOL=tcp)(HOST=sales-server)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=sales.us.acme.com)))
接続プールは別名の完全ディスクリプタを保持しているので、同じ接続文字列を使用するそれ以降の接続要求については、その別名を再度解決する必要がなくなります。これは、tnsnames.ora、.NET構成データ・ソースおよびLDAP別名に当てはまります。接続プールのキャッシュで保持されている完全ディスクリプタを消去するには、OracleDataSourceEnumerator.GetDataSources()を呼び出し、その後にOracleConnection.ClearPool()またはOracleConnection.ClearAllPools()を呼び出します。
接続プーリングが使用されていない場合は、別名を解決して完全ディスクリプタを得る処理を要求のたびに行う必要があります。LDAPの場合は、LDAPサーバーへの問合せが接続要求のたびに発生します。
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 Database Net Services管理者ガイド』を参照 |
ODP.NETは、Oracle Internet DirectoryやMicrosoft Active DirectoryなどのLDAP準拠ディレクトリ・サーバーに含まれる接続記述子にマップされる接続識別子で接続できます。
ODP.NET管理対象外ドライバのLDAPを構成するには、『Oracle Database Net Services管理者ガイド』で、ディレクトリ・ネーミング・メソッドの構成に関する項の手順に従ってください。
ODP.NET管理対象ドライバのLDAPを構成するには、「settingsセクション」と「LDAPsettingsセクション」の手順に従ってください。
|
関連項目: Using LDAPを使用するセクションの詳細と要件は、『Oracle Database Net Services管理者ガイド』と『Oracle Databaseセキュリティ・ガイド』を参照してください。 |
Transport Layer Security (TLS)とその前身であるSecure Sockets Layer (SSL)は、ネットワーク接続を保護する業界標準プロトコルです。管理対象および管理対象外のODP.NETはどちらも、データベースとトランスポートの認証でSSLに対応しています。
|
関連項目: TLS/SSLと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でSecure Sockets Layerの有効化に関する項を参照してください。 |
Kerberosは、分散環境におけるセキュリティのためのネットワーク認証サービスです。ODP.NETアプリケーションは、シングル・サインオンと一元的なユーザー認証の目的でKerberosを使用できます。ODP.NET管理対象外ドライバは、シングル・サインオンと認証の目的でKerberosをサポートします。ODP.NET管理対象ドライバは、Kerberosをサポートしていません。
|
関連項目: Kerberosと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でKerberos認証の構成に関する項を参照してください。 |
ADO.NETでは、OracleConnection.GetSchema APIから5つの異なるタイプのメタデータ・コレクションが公開されています。これにより、アプリケーション開発者は、すべてのOracleデータ・ソースに対して、メタデータの取得を個別のアプリケーション・ベースでカスタマイズできます。このようにして、開発者は複数のデータ・ソースからのメタデータを管理する汎用セットのコードをビルドできます。
公開されているメタデータのタイプは次のとおりです。
MetaDataCollections
テーブル、列、インデックスおよびストアド・プロシージャなどのデータ・ソースから使用できるメタデータ・コレクションのリストです。
制限
要求されたスキーマ情報の範囲を制限して、各メタデータ・コレクションに適用される制限。
DataSourceInformation
製品名やバージョンなど、現在使用されているデータベースのインスタンスについての情報。
DataTypes
データベースがサポートする各データ型についての情報のセット。
ReservedWords
Oracle問合せ言語の予約語。
ODP.NETでは、データベース・スキーマ情報の包括的なセットが提供されています。開発者は、個々のアプリケーション・ベースでGetSchemaメソッドが戻すメタデータを拡張またはカスタマイズできます。
これを行うには、開発者はカスタマイズしたメタデータ・ファイルを作成し、アプリケーションにファイル名を提供する必要があります。方法は次のとおりです。
カスタマイズしたメタデータ・ファイルを作成し、それを.NET FrameworkがインストールされたCONFIGサブディレクトリに置きます。これは、machine.configおよびセキュリティ設定があるディレクトリです。
このファイルには、変更のみではなく、スキーマ設定情報のセット全体を含める必要があります。開発者は、ユーザー固有の要件を検索するスキーマ動作の変更を提供します。たとえば、開発者は内部データベース表にフィルタをかけ、ユーザー固有の表のみを検索できます。
次と同じく、アプリケーションのapp.configファイル内にエントリを追加し、メタデータ・ファイルの名前を名前/値ペアの書式で指定します。
<oracle.dataaccess.client>
<settings>
<add name="MetaDataXml" value="CustomMetaData.xml" />
</settings>
</oracle.dataaccess.client>
GetSchemaメソッドがコールされると、ODP.NETではapp.configファイルでカスタマイズしたメタデータXMLファイルの名前を確認します。最初に、GetSchemaメソッドはプロバイダにちなんで付けられた要素、この例ではoracle.dataaccess.clientでファイル内のエントリを検索します。このXML要素内の名前MetaDataXmlに対応する値は、カスタマイズしたXMLファイルの名前で、この例ではCustomMetaData.xmlです。
メタデータ・ファイルが正しいディレクトリ内にない場合、アプリケーションは、ODP.NETに含まれているデフォルトのメタデータXMLファイルをロードします。
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=100000;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プロパティを署名として使用して接続プールを作成します。
新しい接続をオープンしたとき、接続文字列が既存のプールに完全一致しない場合は、新しいプールが作成されます。ODP.NET 12.1.0.2以下では、一致する必要があるのは接続文字列の属性値のみでした。現在は、接続文字列そのものが完全一致する必要があります。同じ接続に対して異なる順序で指定したキーワードは、別々にプールされます。要求された署名を持つプールがすでに存在する場合、接続はそのプールからアプリケーションに戻されます。
接続プールが作成されると、接続プーリング・サービスは、ConnectionStringのMin Pool Size属性で定義された接続数を最初に作成します。この接続数は、接続プールの接続プーリング・サービスによって常に保持されます。
これらの接続は、常にアプリケーションで使用され、またプール内でも使用できます。
ConnectionStringプロパティのIncr Pool Size属性には、接続プールでより多くの接続が必要になったときに、接続プーリング・サービスで作成される新しい接続の数を定義します。
アプリケーションが接続をクローズすると、接続プーリング・サービスは、接続存続期間がConnection Lifetime属性を超えているかどうかを調べます。超えている場合、接続プーリング・サービスは接続をクローズし、超えていない場合、接続は接続プールに戻ります。接続プーリング・サービスは、接続が接続プールに戻るときのみ、Connection Lifetimeを実行します。
ConnectionStringプロパティのMax Pool Size属性は、接続プールの接続の最大数を設定します。新しい接続が要求されたときに、有効な接続がなく、Max Pool Sizeに達している場合、接続プーリング・サービスは、Connection Timeout属性で定義された時間待機します。Connection Timeoutに達していても、プールに有効な接続がない場合、接続プーリング・サービスは、接続プール要求がタイムアウトしたことを示す例外を呼び出します。接続タイムアウトが発生すると、ODP.NETはそのタイムアウトの原因が、データベース・サーバーが所定の時間内に接続できなかったことであるか、プール・サイズの最大値に達したためにプール内に使用可能な接続がなかったことであるかを判断します。返される例外テキストは、「接続リクエストがタイムアウトしました」(前者の場合)または「プールされた接続リクエストがタイムアウトしました」(後者の場合)となります。
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メソッドを使用して、アプリケーション・ドメイン内のすべての接続プール内の接続をクリアします。
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-3は、有効なレジストリ値を持つ接続プーリングに対して使用されるパフォーマンス・カウンタを示します。
表3-3 接続プーリングのパフォーマンス・カウンタ
| パフォーマンス・カウンタ | 有効な値 | 説明 |
|---|---|---|
|
なし |
|
無効(デフォルト) |
|
|
|
Oracle Databaseで毎秒確立されるセッション数。 |
|
|
|
Oracle Databaseから毎秒切断されるセッション数。 |
|
|
|
接続プールから毎秒確立されるアクティブな接続数。 |
|
|
|
接続プールから毎秒戻されるアクティブな接続数。 |
|
|
|
アクティブな接続プールの合計数。 |
|
|
|
非アクティブな接続プール数。 |
|
|
|
使用中の接続の合計数。 |
|
|
|
すべての接続プールで使用可能な接続の合計数。 |
|
|
|
プールされているアクティブな接続の数。 |
|
|
|
プールされていないアクティブな接続の数。 |
|
|
|
暗黙的にガベージ・コレクションに入った接続数。 |
|
|
|
まもなくプールで利用可能になる接続数。ユーザーはこれらの接続をクローズしましたが、使用可能な接続としてプールに戻される前の、トランザクション完了などのアクション待ちになっています。 |
パフォーマンス・カウンタの公開を個別に有効または無効にするには、タイプREG_SZのレジストリ値PerformanceCountersまたは.NET構成ファイルを使用します。このレジストリ値は次のようになります。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\Assembly_Version
Assembly_Versionは、Oracle.DataAccess.dllの完全なアセンブリ・バージョン番号です。
複数のパフォーマンス・カウンタは、有効な値を追加することで取得できます。たとえば、PerformanceCountersが3に設定されている場合、HardConnectsPerSecondおよびHardDisconnectsPerSecondは有効になります。
.NET構成エントリを使用してパフォーマンス・カウンタを設定できます。.NET構成エントリはレジストリ値設定よりも優先されるので、特定のアプリケーションに使用できます。
.NET構成エントリでは、次の例に示すように名前/値のペアが使用されます。
<configuration>
<oracle.dataaccess.client>
<settings>
<add name="PerformanceCounters"
value="3"/>
</settings>
</oracle.dataaccess.client>
</configuration>
パフォーマンス・カウンタの監視を、アプリケーション・ドメイン、プールまたはデータベース・インスタンスのレベルでできるようになりました。データベース・インスタンス・レベルの監視が適用されるのは、ロード・バランシング機能または高速接続フェイルオーバー機能が有効化されている場合のみです。
インスタンス名の形式は次のとおりです。
<アプリケーション・ドメイン名> [<プロセスID>, <アプリケーション・ドメインID>][<接続文字列/プール名>][<インスタンス名>]。エントリの上限は127文字です。インスタンス名の各フィールドに対して長さの制約があります。次の表に、各フィールドの最大文字数を示します。
| フィールド名 | 最大文字数 |
|---|---|
| アプリケーション・ドメイン | 40 |
| プール名/接続文字列 | 70 |
| データベース・インスタンス名 | 16 |
フィールド値の長さが上限を超えているときは、その文字列は長さ制限に収まるように切り詰められて、続きがあることを示す「...」が末尾に付加されます。たとえば、アプリケーションの名前がProgram.exeで接続文字列がuser id=scott;Password=tiger;data source=inst1;max pool size=125であるとします。アプリケーション・ドメインが2つあるプロセスの場合は、次のようになります。
Program.exe [123, 1]
Program.exe [123, 1][ user id=scott;data source=inst1;max pool siz...]
Program.exe [123, 1][ user id=scott;data source=inst1;max pool siz...] [instA]
Domain 2[123, 2]
Domain 2[123, 2][ user id=scott;data source=inst1;max pool siz...]
Domain 2[123, 2][ user id=scott;data source=inst1;max pool siz...] [instB]
Domain 2[123, 2][ user id=scott;data source=inst1;max pool siz...] [instC]
接続プールの属性は先頭の70文字がよく似ているため、アプリケーションでプール名を設定しておくと監視ツールで各プールを一意に識別できるようになります。.NET構成ファイルでは、プール名属性を次のように設定できます。
ODP.NET管理対象外ドライバ
<configuration>
<oracle.dataaccess.client>
<settings>
.
.
<add name="[connection string without password]" value="connectionPool name='[Pool Name]'"/>
.
.
</settings>
</oracle.dataaccess.client>
</configuration>
ODP.NET管理対象ドライバ
<oracle.manageddataaccess.client>
<version number="*">
<connectionPools>
.
.
<connectionPool connectionString="[connection string without password]" " poolName="[Pool Name]"> </connectionPool>
.
.
</connectionPools>
</version>
</oracle.manageddataaccess.client>
パフォーマンス・カウンタのうち、次の2つの動作は12cリリースで変更されました。
NumberOfPooledConnections: アクティブな接続と使用可能な接続の合計。以前は、この値はアクティブな接続のみの数でした。
NumberOfStasisConnections: サポートされなくなりました。
Oracle Database 12cで新しく導入されたプラガブル・データベース機能を使用すると、スキーマ、スキーマ・オブジェクト、非スキーマ・オブジェクトのポータブル・コレクションをOracle Database内に構成し、これらを個別のデータベースとしてODP.NETに表示することができます。この自己完結型コレクションは、プラガブル・データベース(PDB)と呼ばれます。
PDBにアクセスできるのはODP.NET 12c以降のリリースからです(クライアントはデータベース・サービスを通じてアクセスします)。データベース・サービスには、オプションのPDBプロパティがあります。PDBを作成すると、デフォルトの新しいデータベース・サービスが自動的に作成されます。このサービスはPDBと同じ名前になり、簡易接続構文またはネット・サービス名でのPDBアクセスに使用できます。このサービスの主な役割は管理タスクの実行です。アプリケーションで使用するサービスは別に作成することをお薦めします。
PDBでは、次の機能を除く、すべてのODP.NET機能を使用できます。
連続問合せ通知
クライアント結果キャッシュ
Oracle Notification Serviceを使用した高速アプリケーション通知イベント
ALTER SESSION SET CONTAINER文を使用した、1つのPDBから別のPDBへの切替え
|
関連項目: 『Oracle Database管理者ガイド』のプラガブル・データベースの管理に関する説明を参照 |
エディションベースの再定義を使用すると、アプリケーションが使用中であってもそのデータベース・コンポーネントをアップグレードできます。このため、アプリケーションの停止時間を最小化あるいは排除することができます。
|
関連項目: エディションの詳細は、『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を使用するすべてのアプリケーションに対してエディションを指定できます。
次の例では、ODP.NET管理対象外ドライバの.NET構成ファイルでEditionをE1に設定します。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <oracle.dataaccess.client> <settings> <add name="Edition" value="E1"/> </settings> </oracle.dataaccess.client> </configuration>
|
注意:
|
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 Databaseを設定する方法の詳細は、『Oracle Databaseプラットフォーム・ガイドfor Microsoft Windows』を参照 |
データベース管理者は、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");
}
}
ユーザーのパスワードを失効させることができます。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");
}
}
}
|
注意:
|
データベースの設定が正しければ、データベース・ユーザーのアイデンティティおよび特権を保持し、ユーザーのかわりに監査処理を実行して、プロキシ認証により、中間層アプリケーションでセキュリティを制御できるようになります。そのためには、(実在の)データベース・ユーザー(複数可)のかわりにデータベースに接続し、認証を受けるプロキシ・データベース・ユーザーを作成および使用します。
さらに、プロキシ認証をすると、接続プーリングのスケーラビリティを強化できます。接続プーリングをプロキシ認証と組み合せて使用すると、プロキシ認証済の接続を、実在する複数のユーザー間で共有できます。これは、プロキシに対して確立済の接続およびセッションのみがキャッシュされるためです。プロキシ認証済の接続を要求すると、セッションが実際のユーザーに対して追加作成されますが、このプロキシ認証済接続がプール内に戻されると、追加作成されたセッションは廃棄されます。この設計により、セキュリティを犠牲にすることなくアプリケーションのスケーラビリティを強化できます。
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を使用して分散トランザクションに動的に登録するアプリケーションでは、"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構成ファイルを使用して構成することもできます。詳細は、「Oracle Data Provider for .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オブジェクトの書込み専用プロパティであるActionName、ClientId、ClientInfo、およびModuleNameが公開されています。これらのプロパティは、次のエンドツーエンドのトレース属性に対応しています。
Action - モジュールのINSERT操作やUPDATE操作などのアクションを指定します。
ClientId - HR.HRなどのログオンIDに基づいてエンド・ユーザーを指定します。
クライアント情報 - ユーザー/セッション情報を指定します。
Module - アプリケーションのAccounts ReceivableやGeneral Ledgerなどの機能ブロックを指定します。
|
関連項目:
|
透過的アプリケーション・フェイルオーバー(TAF)は、高可用性を提供するOracle Databaseの機能です。
|
注意: ODP.NET管理対象ドライバは、TAFおよびTAFコールバックをサポートしていません。 |
TAFを使用すると、接続が継続していれば、別のデータベース・インスタンスに自動的に再接続できます。アクティブなトランザクションはロールバックされますが、別のノードを経由した新しいデータベース接続は、元の接続と同一です。これは、接続が失敗した方法に関係なく当てはまります。
TAFを使用すると、アプリケーションを提供するインスタンスが1つ残っているかぎり、クライアントで接続が失われることはありません。データベース管理者は、インスタンスで実行されるアプリケーションを制御して、各アプリケーションのフェイルオーバー命令も作成します。
別のデータベースにセッションがフェイルオーバーした場合、元のセッションで最初に設定されていたNLS設定は、新しいセッションに引き継がれません。したがって、これらのNLS設定は、アプリケーション側で新しいセッションに設定する必要があります。
フェイルオーバーによる遅延を考慮して、アプリケーションでは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イベント・ハンドラが登録されていても、最後に登録されたイベント・ハンドラのみが起動されます。
|
注意: フェイルオーバーが有効な環境では、分散トランザクションはサポートされません。 |
|
関連項目:
|