Oracle® Data Provider for .NET開発者ガイド ODAC 12.2c リリース1 (12.2.0.1) for Microsoft Windows E88311-03 |
|
![]() 前 |
![]() 次 |
Oracle Data Provider for .NETは、ユーザー名とパスワード、Windowsネイティブ認証、KerberosおよびTransport Layer Security/Secure Sockets Layerなど様々な方法でOracle Databaseに接続できます。この項では、OracleConnection
プロバイダ固有の機能について説明します。内容は次のとおりです。
管理対象および管理対象外ODP.NETは、Oracle Database Exadata Express Cloud Serviceへの接続をサポートしています。
設定手順
Exadata Expressに接続する際には、最新バージョンのODACを使用することをお薦めします。Oracle Database Exadata Express Cloud Service用のODACのダウンロード、インストールおよび構成方法については、次を参照してください。
http://www.oracle.com/technetwork/topics/dotnet/tech-info/dotnetcloudexaexpress-3112654.html
既知の制限事項
Oracle Database Exadata Express Cloud Serviceに接続する際、管理対象および管理対象外ODP.NETは次の機能をサポートしていません。
.NETの一括コピー
アドバンスト・キューイング
ユーザー名およびパスワード以外の認証
アプリケーション・コンティニュイティ
クライアント結果キャッシュ
連続問合せ通知
データ型
BFILE
IN
またはIN/OUT
のパラメータ・バインドを使用する際のユーザー定義タイプ
ユーザー定義タイプには、オブジェクト、コレクション(VARRAY
とネストした表)および参照を含む
サイズ制限を32 KBに増やしたVARCHAR2
注意:
4 KBまでのサイズのVARCHAR2
はサポートされます。
IN
またはIN/OUT
のパラメータ・バインドを使用する際のXMLType
データベース常駐接続プーリング
分散トランザクション
計画済停止、実行時接続ロード・バランシング、高速接続フェイルオーバーなどFANに依存する機能はサポートされません。
ODP.NET 12.1以下では、FANを有効にすると、ODP.NETアプリケーションでエラーが発生します
シャーディング
表3-2は、サポートされている接続文字列属性のリストです。
表3-2 サポートされている接続文字列属性
接続文字列属性 | 説明 | デフォルト値 |
---|---|---|
|
データベース・セッションが切断され、リカバリ可能なエラーになった場合に、トランザクションおよび非トランザクション操作を、データベース・リクエストで自動的に非破壊的かつ迅速にリプレイできます。 ODP.NET管理対象ドライバでは使用できません |
|
|
接続の最小存続時間(秒)。 |
|
|
プールから使用可能な接続を待機する最小時間(秒)。 |
|
|
.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"); } }
関連項目:
接続文字列の詳細は、OracleConnectionプロパティを参照してください。
文キャッシングの詳細は、OracleCommandオブジェクトを参照してください。
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セクションの手順に従ってください。
Oracle Databaseリリース18c、バージョン18.1からは、組織は一元管理されたユーザー (CMU)をActive Directoryで使用できます。この機能は、一元的なID管理ソリューションとしてActive Directoryを使用することを望む組織のために設計されています。組織は、CMUおよびActive DirectoryでKerberos、PKIまたはパスワード認証を使用できます。
関連項目:
Using LDAPを使用するセクションの詳細と要件は、Oracle Database Net Services管理者ガイドとOracle Databaseセキュリティ・ガイドを参照してください。
Transport Layer Security (TLS)とその前身であるSecure Sockets Layer (SSL)は、ネットワーク接続を保護する業界標準プロトコルです。管理対象および管理対象外のODP.NETはどちらも、データベースとトランスポートの認証でSSLに対応しています。
SSLは最初にNetscape社によって開発されましたが、Internet Engineering Task Force (IETF)がその開発を引き継ぎ、名前をTransport Layer Security (TLS)に変更しました。
基本的には、TLSはSSLバージョン3.0に段階的改善を加えるものです。
ODP.NET管理対象ドライバは、SSL 3.0と、TLS 1.0、1.1および1.2をサポートします。ODP.NET管理対象外ドライバは、それが認証されているバージョンのOracle Database Clientと同じバージョンのSSLとTLSをサポートします。
SSL/TLSクライアントでは、接続しようとしているデータベース・サーバーの識別名(DN)が正しいことを保証できます。DN一致の原ラメは、SSL_SERVER_DN_MATCH
(sqlnet.ora
)とSSL_SERVER_CERT_DN
(tnsnames.ora
)で、これは.NET構成ファイルでも定義できます。
DN一致を有効にするには、SSL_SERVER_DN_MATCH
をTrue
(またはOn
、Yes
)に設定します。SSL_SERVER_CERT_DN
はオプションです。管理者が、一致させたいDNを正確に指定できます。SSL_SERVER_CERT_DN
が設定されていない場合、SERVICE_NAME
値と、サーバー証明書のDNの共通名(CN)部分とを比較して一致が実行されます。
関連項目:
IETF Webサイトの次の場所にあるTLSプロトコル・バージョン1.0(RFC 2246)
settingsセクションのSSL_VERSION
。
注意:
SSLが最も広く認識されている用語であるため、SSLでもTLSでも該当する場合、この項では説明を簡単にするためにSSLという用語を使用します。ただし、これらのプロトコルの使用方法または構成方法に違いがある場合、この項では、記述内容がSSLに該当するか、TLSに該当するかを明記します。
Secure Sockets Layerをクライアントで構成する場合、ウォレットが作成されていることを確認して、SSL付きTCP/IPをクライアントで使用してください。オプションで、追加の手順を実行して構成を強化できます。
SSL構成に関するトピック:
手順1: クライアント・ウォレット作成の確認
次の手順に進む前に、クライアントでウォレットが作成されていることと、クライアントに有効な証明書があることを確認する必要があります。
ODP.NET管理対象ドライバはファイルおよびMicrosoft Certificate Store (MCS)ベースのウォレットをサポートします。
ファイルベース・ウォレットでは、Oracle Wallet Managerを使用して、ウォレットが作成されていることを確認します。ウォレットの確認の詳細は、『Oracle Databaseセキュリティ・ガイド』の手順1A: サーバーでのウォレット作成の確認に関する項を参照してください。
MCSでは、Windowsドメイン資格証明がクライアント資格証明に使用されます。そのため、ODP.NETアプリケーションの実行時には、有効なドメイン・ログオンを使用する必要があります。ODP.NET管理対象ドライバは自分のまたは個人的な証明書ストアから資格証明を取得します。MCSウォレットを使用するには、サーバーも構成する必要があります。MCSのサーバーの設定詳細は、『Oracle Databaseプラットフォーム・ガイドfor Microsoft Windows』のMicrosoft Certificate Servicesに関する項を参照してください。
手順2: クライアントでのSSL付きTCP/IPの使用
ODP.NETデータ・ソースはSSLを使用するように変更する必要があります。特に、トランスポート・プロトコルはSSL付きTCP/IPまたはOracleで言うところの"tcps"を使用するように変更する必要があります。SSLとともに使用するODP.NETデータ・ソースの例は次のようになります。
finance = (DESCRIPTION= (ADDRESS = (PROTOCOL=tcps) (HOST=finance_server) (PORT=1575) ) (CONNECT_DATA = (SERVICE_NAME=Finance.us.example.com) ) )
手順3: 必要なクライアントSSL構成の指定(ウォレット・ロケーション)
ウォレット・ロケーションを指定するために、sqlnet.ora
または.NETアプリケーション構成を編集します。
ファイル・ベース・ウォレットのSSLウォレット・ロケーションを設定する例です。ここで、<wallet_location>
は、指定したロケーションでクライアント・ウォレットが格納されます。
wallet_location = (SOURCE=(METHOD= File) (METHOD_DATA=(DIRECTORY=<wallet_location>)))
MCSベース・ウォレットのSSLウォレット・ロケーションを設定する例は次のようになります。
wallet_location = (SOURCE=(METHOD= MCS))
手順4: 必要なSSLバージョンのクライアントでの設定(オプション)
SSL_VERSION
パラメータは、sqlnet.ora
または.NETのapplication.config
、web.congig
またはmachine.config
ファイルを介して設定できます。通常、このパラメータを設定する必要はありません。このパラメータのデフォルト設定はany
で、データベース・サーバーがあらゆる必要な制限を認証されているSSLバージョンに適用できるようにします。次にsqlnet.ora
の設定例を示します。
SSL_VERSION=3.0
手順5: クライアントにおける認証サービスとしてのSSLの設定(オプション)
sqlnet.ora
またはapplication.config
、web.congig
またはmachine.config
のファイルにSQLNET.AUTHENTICATION_SERVICE
パラメータを設定し、SSLがデータベース外部認証方法で使用できるようにします。
SSLはトランスポート暗号化媒体として使用できます。そのため、この設定の「オプション」指定です。
データベース外部認証サービスとしてSSLを使用する場合、クライアント証明書とマッチングするデータベースの外部認証ユーザーを作成する必要があります。
次にsqlnet.ora
でのSSL外部認証を可能にする設定例を示します。
SQLNET.AUTHENTICATION_SERVICES = (TCPS)
注意:
ODAC 12cリリース4より前のリリースでは、ODP.NET管理対象ドライバSSL接続はデータベース・サーバー・マシンの動的(エフェメラル)ポートにリダイレクトされていました。ODAC 12cリリース4以降では、管理対象ODP.NET SSL接続は、Oracle Listenerに対する元のソケット接続を続けるようになりました。したがって、ファイアウォールで必要なのはOracle Listenerのポート(例:1521)に対するアクセスのみです。
関連項目:
TLS/SSLと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でSecure Sockets Layerの有効化に関する項を参照してください。
外部で識別されるデータベース・ユーザーの作成の詳細は、『Oracle Databaseセキュリティ・ガイド』の外部認証されるユーザーの作成に関する項を参照してください。
この項では、よく発生する問題点と、それを解決する一般的な手順について説明します。
TLS/SSLウォレットの一般的なエラー
Microsoft Windowsでは現在、ウォレットがMD5アルゴリズムを使用することは制限されています。Oracle Public Key Infrastructure(orapki
)ユーティリティ12.1以下ではデフォルトのオプションだったため、Oracleウォレットはこのアルゴリズムで生成された可能性があります。
orapkiは、orapki.exe
を参照します。このユーティリティは、Oracleクライアント(管理者)の完全インストールの一部です。Oracle Instant Clientには含まれていません。ユーティリティが必要なのはウォレットを設定するときだけで、ウォレットと一緒にユーティリティを配布する必要はありません。
TLS/SSLの設定時に、0x80004005コードを伴う「ORA-0052: SSLハンドシェイク中に失敗しました」エラーが発生し、最初の内部例外が「SSPI呼出しに失敗」、2番目の内部例外が「関数に送信されたトークンが無効」の場合、MD5が使用されているときなど、Microsoft Security Support Provider Interface (SSPI)でOracleウォレットが拒否された可能性が高いと考えられます。これは、ハンドシェイク時のエラーです。このエラーは、かわりにSHA-2アルゴリズムを使用して解決できます。
2番目の内部例外が「パッケージに指定された資格証明は認識されませんでした」の場合は、ユーザー証明書が認証局(CA)なしに生成されました。このエラーは、orapki
を使用してCA/ルート証明書を生成したうえで、ユーザー・ウォレット/証明書を再生成し、この新しいCA/ルート証明書を示すことで解決できます。
次の手順では、orapki
とSHA-2を使用してOracleウォレットを生成します。この手順に従ってウォレットを生成するときには、任意のバージョンのorapki
を使用できます。
ルート・ウォレット、たとえばCAウォレットを作成します。
orapki wallet create -wallet ./root -pwd <password>
自己署名証明書(CA証明書)をルート・ウォレットに追加します。
orapki wallet add -wallet ./root -dn 'CN=<my root>' -keysize 1024 -self_signed -validity 3650 -pwd <password> -sign_alg sha512
自己署名済証明書をウォレットからエクスポートします。
orapki wallet export -wallet ./root -dn 'CN=<my root>' -cert ./root/b64certificate.txt -pwd <password>
ユーザー・ウォレット、たとえば顧客ウォレットを作成します。
orapki wallet create -wallet ./user -pwd <password> -auto_login
証明書リクエストの追加
orapki wallet add -wallet ./user -dn 'CN=<client's hostname>' -keysize 1024 -pwd <password> -sign_alg sha512
証明書リクエストをエクスポートします。
orapki wallet export -wallet ./user -dn 'CN=<client's hostname>' -request ./user/creq.txt -pwd <password>
CAによって発行された証明書を作成します。
orapki cert create -wallet ./root -request ./user/creq.txt -cert ./user/cert.txt -validity 3650 -pwd <password> -sign_alg sha512
信頼できる証明書(CA証明書)をウォレットに追加します。この例では、クライアントとサーバーの両方のウォレットに同じCAを使用すると想定しています。
orapki wallet add -wallet ./user -trusted_cert -cert ./root/b64certificate.txt -pwd <password>
新しい証明書を追加します。
orapki wallet add -wallet ./user -user_cert -cert ./user/cert.txt -pwd <password> -sign_alg sha512
ユーザー・ウォレットの内容を表示します。
orapki wallet display -wallet ./user -pwd <password>
サーバー・ウォレットを作成します。
orapki wallet create -wallet ./server -pwd <password> -auto_login
サーバー証明書リクエストを追加します。
orapki wallet add -wallet ./server -dn 'CN=<server's hostname>' -keysize 1024 -pwd <password> -sign_alg sha512
証明書リクエストをエクスポートします。
orapki wallet export -wallet ./server -dn 'CN=<server's hostname>' -request ./server/creq.txt -pwd <password>
CAによって発行されたサーバー証明書を作成します。
orapki cert create -wallet ./root -request ./server/creq.txt -cert ./server/cert.txt -validity 3650 -pwd <password> -sign_alg sha512
信頼できる証明書(CA証明書)をサーバー・ウォレットに追加します。この例では、クライアントとサーバーの両方のウォレットに同じCAを使用すると想定しています。
orapki wallet add -wallet ./server -trusted_cert -cert ./root/b64certificate.txt -pwd <password>
サーバー・ウォレットのuser_cert
証明書を追加します。
orapki wallet add -wallet ./server -user_cert -cert ./server/cert.txt -pwd <password> -sign_alg sha512
サーバー・ウォレットの内容を表示します。
orapki wallet display -wallet ./server -pwd <password>
安全性の高い外部パスワード・ストア(SEPS)は、パスワードの資格証明を安全に格納するクライアント側ウォレットの使用です。ODP.NET管理対象ドライバおよび管理対象外ドライバの両方について、外部パスワード・ストアを使用するように構成できます。
Oracleウォレットは、認証および署名用資格証明を安全に格納するコンテナです。ウォレットにより、データベース接続をパスワード資格証明に依存する大規模なデプロイメントを簡素化できます。アプリケーションでは、埋込みユーザー名およびパスワードが必要なくなり、これによりセキュリティ・リスクを減らします。
SEPSを構成するための手順:
手順1:ウォレット・ファイルを作成します
mkstore
ユーティリティを使用してウォレット・ファイルを作成し、資格証明を挿入します。
ステップ1a:コマンド行で次の構文を使用して、クライアント上にウォレットを作成します。
mkstore -wrl wallet_location -create
次に例を示します。
mkstore -wrl c:\oracle\product\12.1.0\db_1\wallets -create Enter password: password
ステップ1b:コマンドラインで次の構文を使用して、ウォレットにデータベース接続の資格証明を作成します。
mkstore -wrl wallet_location -createCredential db_connect_string username Enter password: password
次に例を示します。
mkstore -wrl c:\oracle\product\12.1.0\db_1\wallets -createCredential orcl system Enter password: password
手順2:構成がクライアント・ウォレットを示すようにします
クライアントのsqlnet.ora
ファイルに、WALLET_LOCATION
パラメータを入力し、手順1で作成したウォレットのディレクトリの場所に設定します。
たとえば、$ORACLE_HOME/network/admin
にウォレットを作成し、OracleホームがC:\app\client\
<user>
\product\
<version>
\client_1\
に設定されている場合、クライアントのsqlnet.ora
ファイルには次のように指定する必要があります。
WALLET_LOCATION = (SOURCE =(METHOD = FILE) (METHOD_DATA = (DIRECTORY = C:\app\client\<user>\product\<version>\client_1\Network\Admin) ) )
手順3:SEPSをオンにします
手順3:SEPSをオンにします
SQLNET.WALLET_OVERRIDE = TRUE
この設定により、すべてのCONNECT /@db_connect_string
文で、データベースへの認証に、指定された場所にあるウォレットの情報が使用されます。
外部認証が使用されている場合、そのウォレットによる認証ユーザーはCONNECT /@db_connect_string
構文を使用し、前述の手順で指定したデータベースにユーザー名およびパスワードを使用せずにアクセスできます。ただし、ウォレット・ファイルはデータベース資格証明に対して最新に保っておく必要があることに注意してください。データベース資格証明が変更され、ウォレット・ファイルがそれに対応して変更されていない場合、接続は失敗します。
関連項目:
ウォレットの設定の詳細は、「Oracle Data Provider for .NET管理対象ドライバの構成」を参照してください。
安全性の高い外部パスワード・ストアおよびOracle databaseでの構成の詳細は、『Oracle Databaseセキュリティ・ガイド』のパスワード資格証明用の安全性の高い外部パスワード・ストアの管理に関する項を参照してください。
Kerberosは、分散環境におけるセキュリティのためのネットワーク認証サービスです。ODP.NETアプリケーションは、シングル・サインオンと一元的なユーザー認証の目的でKerberosを使用できます。ODP.NET管理対象外ドライバおよび管理対象ドライバは両方ともデータベース・サーバーに対する外部認証としてKerberosをサポートします。
ODP.NETは、ファイル・ベースKerberosクライアント資格証明キャッシュ(CC)およびKerberosクライアント資格証明としてWindowsログオン資格証明を使用する機能の両方をサポートします。後者はMSLSAベースKerberos認証と呼ばれます。
ファイル・ベースKerberosクライアント資格証明キャッシュ(CC)を使用するには、Oracle Call Interface (OCI)のフル・インストールに関連付けられている次の実行ファイルが必要です。
okinit.exe
oklist.exe
okdstry.exe
Kerberos5資格証明を入手し、ファイル・ベース資格証明キャッシュ(CC)に格納するためにこの実行ファイルが必要です。ただし、資格証明キャッシュを作成後、資格証明が有効であるかぎり、前述の実行可能ファイルは実行時にODP.NETアプリケーションでは不要になります。
Kerberos5データベース認証をODP.NET管理対象ドライバと一緒に使用するには、MIT Kerberos for Windows 4.0.1を次の場所からODP.NET管理対象ドライバと同じマシンにダウンロードしてインストールします。
http://web.mit.edu/kerberos/dist/
関連項目:
Kerberosと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でKerberos認証の構成に関する項を参照してください。
後述のKerberos構成例を表示する際には、次の"キー"を参照してください。
oracleclient
= ドメインのOracle Clientユーザーを表すためにOracleデータベース・クライアント・プログラムによって使用されるKerberos/Windowsドメイン・ユーザーID
oracleserver
= Oracleデータベース・サーバーによって使用されるKerberos/Windowsドメイン・ユーザーID
DOMAIN.COMPANY.COM
= Kerberos/Windowsドメイン
dbhost.company.com
= Oracleデータベース・サーバー・マシン・ホスト名
kerberos_service_name
= Kerberosサービス名
dc.company.com
= Kerberos Key Distribution Center (KDC)およびWindows Domain Controllerのホスト名
Kerberos認証の構成トピック:
手順3: DBサーバーのKerberosプリンシパル名をDBサーバーのKerberosサービス(SPNマッピング)に関連付け、サーバー・キータブ・ファイルを生成します
手順6: Kerberos KDC(MSLSAのWindowsドメイン・コントローラ)を示すkerberos構成ファイルを作成します
手順7: Oracleデータベース・クライアントおよびサーバーのsqlnet.oraまたは.NET構成が前述のKerberos構成ファイルを示すように構成します
手順10: 手順1で設定されたKerberosクライアント・ユーザーと一致する外部認証データベース・ユーザーを設定します(大文字、小文字に注意)
手順1:Windowsサービス・ファイルを更新し、"kerberos5"エントリを含めます
Windowsサービス・ファイル(C:\windows\system32\drivers\etc\services
)のKerberosエントリを変更します。変更前:
kerberos 88/tcp krb5 kerberos-sec #Kerberos
変更後:
kerberos 88/tcp kerberos5 krb5 kerberos-sec #Kerberos
手順2:クライアントとサーバーのKerberosユーザー(MSLSAのWindowsドメイン・ユーザー)を作成します
前述の"key"で示すように、oracleclient
およびoracleserver
をそれぞれクライアントとサーバーのKerberosユーザーIDとして使用します。
ODP.NETは、次の属性を持つWindowsドメイン・ユーザーを使用してMSLSAをサポートします。
"Kerberos DES"はオフ
"Kerberos AES 128ビット"はオン
"Kerberos AES 256ビット"はオン
"Kerberos事前認証必要なし"はオン
手順3:DBサーバーのKerberosプリンシパル名をDBサーバーのKerberosサービス(SPNマッピング)に関連付け、サーバー・キータブ・ファイルを生成します
Kerberos KDC (MSLSAのWindowsドメイン・コントローラ)で、管理者として次のコマンドを実行します。
> ktpass -princ kerberos_service_name/dbhost.company.com@DOMAIN.COMPANY.COM /crypto all /mapuser oracleserver@DOMAIN.COMPANY.COM /pass <oracleserver password> /out v5srvtab > setspn -A kerberos_service_name/dbhost.company.com@DOMAIN.COMPANY.COM oracleserver
手順4:サービス・プリンシパルに対するサーバー・ユーザーのマッピングを確認します
Kerberos KDCで、次のコマンドを実行し、出力をメモします。
> setspn -L oracleserver Registered ServicePrincipalNames for CN=oracleserver,CN=Users,DC=domain,DC=company,DC=com: kerberos_service_name/dbhost.company.com kerberos_service_name/dbhost.company.com@DOMAIN.COMPANY.COM
手順5:サーバーのsqlnet.oraが、手順2で生成したキータブ・ファイルを示すように設定します
サーバーのsqlnet.ora
に次の行を追加します。
sqlnet.kerberos5_keytab = c:\krb\v5srvtab
手順6:Kerberos KDC(MSLSAのWindowsドメイン・コントローラ)を示すkerberos構成ファイルを作成します
kerberos構成ファイルの例(krb.conf
):
[libdefaults] default_realm = DOMAIN.COMPANY.COM [realms] DOMAIN.COMPANY.COM = { kdc = dc.company.com } [domain_realm] .domain.company.com = DOMAIN.COMPANY.COM domain.company.com = DOMAIN.COMPANY.COM .DOMAIN.COMPANY.COM = DOMAIN.COMPANY.COM DOMAIN.COMPANY.COM = DOMAIN.COMPANY.COM
手順7:Oracleデータベース・クライアントおよびサーバーのsqlnet.oraまたは.NET構成が前述のKerberos構成ファイルを示すように構成します
クライアントまたはサーバーのsqlnet.ora
を編集し、組み込みます。
sqlnet.kerberos5_conf = C:\krb\krb.conf
または、クライアント・アプリケーション構成を編集して(設定セクションで)組み込みます。
<setting name="sqlnet.kerberos5_conf" value="C:\krb\krb.conf" />
手順8:クライアントsqlnet.oraまたは.NET構成で資格証明キャッシュ・ファイルまたはMSLSAを示します
資格証明キャッシュ・ファイルを示す例:
sqlnet.kerberos5_cc_name = c:\krb\krb.cc
MSLSAを示す例:
sqlnet.kerberos5_cc_name = MSLSA:
手順9:sqlnet.oraまたは.NET構成のクライアントとサーバー認証サービスをKerberos5に設定します
sqlnet.authentication_services=(Kerberos5)
手順10:手順1で設定されたKerberosクライアント・ユーザーと一致する外部認証データベース・ユーザーを設定します(大文字、小文字に注意)
create user "ORACLECLIENT@DOMAIN.COMPANY.COM" identified externally; grant connect, create session to "ORACLECLIENT@DOMAIN.COMPANY.COM";
手順11:Windowsドメイン・クライアント・ユーザー(MSLSA用)を介してクライアント・マシンにログインするか、okinitを実行してクライアントKerberosユーザー(ファイル・ベースCC用)を認証します。
okinit oracleclient
手順12:ODP.NETアプリケーションを実行します
注意:
クライアントとサーバーを構成後、最後の2つの手順のみがODP.NETアプリケーションを実行するために継続的に必要な手順です。
Microsoft Visual Cランタイム・ライブラリ(MSVCRT.DLL)のバグによって、MicrosoftランタイムではKerberos5構成のODP.NET管理対象ドライバの設定が無視される可能性があります。そのような場合は、エラー・メッセージが表示されます。
OracleInternal.Network.NetworkException (0x80004005): NA Kerberos5: Authentication handshake failure at stage: krb5_sname_to_principal: default realm not found. Please set SQLNET.Kerberos5_conf.
このエラーを回避するには、ODP.NETアプリケーションのランタイム環境のKRB5_CONFIG
が、SQLNET.Kerberos5_conf
によって示されたKerberos5構成ファイルを示すように手動で設定します。次に例を示します。
set KRB5_CONFIG=c:\oracle\network\admin\krb5.ini
関連項目:
Kerberosと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でKerberos認証の構成に関する項を参照してください。
Windowsのネイティブ認証アダプタで、OracleユーザーはWindowsユーザー・ログイン資格証明のみを使用してデータベースに対して認証できます。シングル・サインオンを可能にする方法を提供し、ユーザーおよびロールの資格証明管理を簡素化します。Windowsのネイティブ認証は、Windowsネイティブ認証(NTS)とも呼ばれています。
注意:
Microsoft .NET APIの制限によって、ODP.NET管理対象ドライバはKerberosベース資格証明ではなく、Microsoft NT LAN Manager (NTLM)を介したWindowsネイティブ認証(NTS)のみをサポートします。通常、WindowsドメインおよびOracleデータベース・サーバーがデフォルトで透過的にNTLMとKerberosドメイン資格証明の両方をサポートするため、この制限はODP.NET管理対象ドライバ・アプリケーションからは見えません。
ODP.NETクライアントのNTSを構成する手順:
手順1:OSAUTH_PREFIX_DOMAINが正しく設定されていることを確認します
OSAUTH_PREFIX_DOMAIN
が適切に設定されていることを確認します。外部で識別されたユーザーIDがドメインを含めるようにするには、trueに設定します。それ以外の場合はfalseに設定します。パラメータはHKLM/software/oracle/HOME<ORACLE_SID>
にあるレジストリ設定です。たとえば、ORACLE_SID
がr1
の場合、HKLM/software/oracle/HOMEr1
に置かれます。
手順2:外部で識別されたデータベース・ユーザーを設定します
手順0の設定がtrueと仮定した場合、次のコマンドを使用して外部で識別されたデータベース・ユーザーを必要なWindowsドメイン・ユーザーと関連付けます。
create user "MYDOMAIN\MYUSER" identified externally; grant connect, create session to "MYDOMAIN\MYUSER";
手順3:認証方法としてNTSを使用するためにクライアント構成を設定します
クライアントのsqlnet.oraまたはアプリケーション設定を編集して、NTSをsqlnet.authentication_services
に追加します。たとえば、次のようになります。
sqlnet.authentication_services = (NTS)
注意:
クライアントとサーバーを構成後、最後の2つの手順のみがODP.NETアプリケーションを実行するために継続的に必要な手順です。
関連項目:
Windowsネイティブ認証の詳細は、Windows用の『Oracle Databaseプラットフォーム・ガイドfor Microsoft Windows』の「Windows環境におけるデータベース・ユーザーの認証」を参照してください。
ODP.NETはイントラネットおよびクラウド・デプロイメントの両方のネットワークのデータ暗号化および整合性を有効化します。これにより、データが認証されたユーザー以外のすべてのユーザーから隠れ、元のメッセージ・コンテンツが変更されていないことを保証します。以前のリリースでは、これらの機能はOracle Advanced Security Option(ASO)暗号化と呼ばれていました。Oracle Database 12cからは、ネットワーク・データ暗号化とデータ整合性を使用する際にOracle ASOが必要なくなりました。
管理対象および管理対象外のODP.NETは次の暗号化標準およびアルゴリズムをサポートします。
Advanced Encryption Standard(AES)
AES 128ビット
AES 192ビット
AES 256ビット
RSA RC4
128ビット
256ビット
Triple-DES (3DES)
112ビット
168ビット
ODP.NET管理対象ドライバは次の設定を使用してネットワーク暗号化を構成します。
SQLNET.ENCRYPTION_CLIENT
SQLNET.ENCRYPTION_TYPES_CLIENT
関連項目:
使用方法の定義および詳細は、「settingsセクション」を参照してください。
管理対象および管理対象外ODP.NETは次のデータ整合性アルゴリズムをサポートします。
MD5
SHA-1
SHA-2
SHA-256
SHA-384
SHA-512
関連項目:
ネットワーク暗号化および整合性、またはODP.NET管理対象外ドライバ用の構成の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
ODP.NET管理対象ドライバでネットワーク暗号化またはデータ整合性を構成するには、Oracle Data Provider for .NET管理対象ドライバの構成で、SQLNET.CRYPTO_CHECKSUM_CLIENT
およびSQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT
設定を参照してください。データ・サーバー・マシンで、sqlnet.ora
ファイルのSQLNET.CRYPTO_CHECKSUM_SERVER
パラメータとSQLNET.CRYPTO_CHECKSUM_TYPES_SERVER
パラメータを構成する必要がある可能性があります。
ADO.NETでは、OracleConnection.GetSchema
APIから5つの異なるタイプのメタデータ・コレクションが公開されています。これにより、アプリケーション開発者は、すべてのOracleデータ・ソースに対して、メタデータの取得を個別のアプリケーション・ベースでカスタマイズできます。このようにして、開発者は複数のデータ・ソースからのメタデータを管理する汎用セットのコードをビルドできます。
公開されているメタデータのタイプは次のとおりです。
MetaDataCollections
テーブル、列、インデックスおよびストアド・プロシージャなどのデータ・ソースから使用できるメタデータ・コレクションのリストです。
Restrictions
要求されたスキーマ情報の範囲を制限して、各メタデータ・コレクションに適用される制限。
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
属性で定義された接続数を最初に作成します。高速接続フェイルオーバーが無効な接続を削除するか接続存続期間が超えないかぎり、この接続数は、接続プールの接続プーリング・サービスによって常に保持されます。前述の2つのケースの場合、接続数は最小プール・サイズを下回る可能性があります。その場合、ODP.NETは次の接続リクエストで最小プール・サイズ・レベルのリストアを試みます。
これらの接続は、常にアプリケーションで使用され、またプール内でも使用できます。
ConnectionString
プロパティのIncr
Pool
Size
属性には、接続プールでより多くの接続が必要になったときに、接続プーリング・サービスで作成される新しい接続の数を定義します。
アプリケーションが接続をクローズすると、接続プーリング・サービスは、接続存続期間がConnection Lifetime
属性を超えているかどうかを調べます。超えている場合、接続プーリング・サービスは接続を破棄し、超えていない場合、接続は接続プールに戻ります。接続プーリング・サービスは、Close()
またはDispose()
が起動されたときのみ、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文字です。インスタンス名の各フィールドに対して長さの制約があります。次の表に、各フィールドの最大文字数を示します。
表3-4 パフォーマンス・カウンタのフィールド名と、最大文字数
フィールド名 | 最大文字数 |
---|---|
アプリケーション・ドメイン |
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文字がよく似ているため、アプリケーションでプール名を設定しておくと監視ツールで各プールを一意に識別できるようになります。たとえば、プール名を使用するとき、プロセスは次のように表示されます。
Domain 2[123, 2][Pool Name][instC]
.NET構成ファイルでは、プール名属性を次のように設定できます。
ODP.NET管理対象ドライバ
<oracle.manageddataaccess.client> <version number="*"> <connectionPools> . . <connectionPool connectionString="[connection string without password]" poolName="[Pool Name]"> </connectionPool> . . </connectionPools> </version> </oracle.manageddataaccess.client>
ODP.NET管理対象外ドライバは、<oracle.manageddataaccess.client>
タグを<oracle.unmanageddataaccess.client>
タグに置き換えることによって、上にリストしたのと同じプール属性とフォーマットを使用できます。
ODP.NET管理対象外ドライバ
<configuration> <oracle.dataaccess.client> <settings> . . <add name="[connection string without password]" value="connectionPool name='[Pool Name]'"/> . . </settings> </oracle.dataaccess.client> </configuration>
パフォーマンス・カウンタのうち、次の2つの動作は12cリリースで変更されました。
NumberOfPooledConnections
: アクティブな接続と使用可能な接続の合計。以前は、この値はアクティブな接続のみの数でした。
NumberOfStasisConnections
: サポートされなくなりました。
クライアント側の接続プーリングは、中間層マシンにとって非常に効率的です。ただし、アイドル接続の中間層サーバーが大量にある場合、データベース・サーバー・リソースを大量に消費する可能性があります。アイドル接続の数は最小限におさえることを目的としていますが、中間層サーバーが増加すると、それぞれにアプリケーション間で共有できないアイドル接続を持つ可能性があるため難しくなります。
データベース常駐の接続プール(DRCP)は、データベース・サーバー・レベルで接続をプールすることでリソース使用率を最適化することを目的としており、これにより多くのアプリケーション間で共有できます。利点は、スケーラビリティが向上し、データベース・サーバー・レベルでリソース使用率が低下することです。
管理対象および管理対象外ODP.NETは、DRCPをサポートするように拡張され、これによりDRCP接続を確立および切断してデータベース・サーバー・リソースをさらに有効に活用できます。
DRCPについて
DRCPプール・サーバーのプロセスは、それぞれが専用サーバー・プロセスとデータベース・セッションを組み合せたものと同等です。これらは、プールされたサーバーと呼ばれます。プールされたサーバーは、同じホストまたは複数のホストで実行されている複数のアプリケーションによる共有が可能です。
DRCPがOracle Database Real Application Clusters (Oracle RAC)用に構成されている場合、プール構成は各データベース・インスタンスに適用されます。1つのインスタンスでプールを起動または停止すると、すべてのインスタンスのプールが起動または停止されます。
DRCPおよびODP.NET
DRCPは、ODP.NETのクライアント側のプーリングを補完するサーバー側のプールです。これらの2つのプールは一緒に使用できます
典型的な専用サーバー・モードでは、クライアント側の接続プーリングによって、サーバー・ラウンド・トリップとソケット/セッション作成の両方が節約されます。接続のオープン/クローズ手順では、サーバー・ラウンド・トリップは最初のOpen()
にのみ含まれます。同じ接続に対する後続のオープン/クローズ手順の場合、接続はクライアント・アドレス空間にローカルにプールされているため、クライアントからサーバーへの対話は必要ありません。
DRCPを有効にすると、クライアントが接続を確立するときに必要に応じて接続にプールされたサーバーが割り当てられます。接続がクローズされると、データベース・サーバーはDRCPサーバー・セッションをリリースしてサーバー側プールに戻し、DRCPサーバー・セッションを効率的に再利用できるようにします。このサーバー・セッションは、同じプールまたは同一または異なる中間層ホストの異なるプールによって再利用できます。
DRCPおよびODP.NETの構成
次の項では、クライアント側およびサーバー側でDRCPを構成する方法を説明します。
クライアント側でのDRCPの構成
ODP.NET開発者は、接続記述子で(SERVER=POOLED)
を使用することで、クライアント側でDRCPを有効にできます。
サンプル接続記述子:
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales.example.com)(SERVER=POOLED)))
サーバー側でのDRCPの構成
Oracleデータベースには、SYS_DEFAULT_CONNECTION_POOL
と呼ばれるデフォルトの接続プールがあります。デフォルトでは、このプールは作成されますが起動はされません。データベース常駐接続プーリングを使用可能にするには、接続プールを明示的に起動する必要があります。
プールを起動し終了するには、データベース管理者(DBA)がSYSDBA
としてログインする必要があります。
SQL> EXECUTE DBMS_CONNECTION_POOL.START_POOL();
アプリケーションが複数の中間層サーバー間でDRCP接続プールを共有する場合、アプリケーションには、サーバー・プールを一意に識別する文字列値にOracleConnection.DRCPConnectionClass
プロパティを設定するオプションがあります。このプロパティを設定してDRCP接続をオープンすると、ODP.NETはその特定のサーバー・プールからの接続を使用するようにDRCPに指示します。この機能によって、データベース・サーバーは複数の中間層サーバー間で容易に拡張できるようになります。
例3-1 データベース常駐接続プーリング・アプリケーションの使用: サンプル・コード
// This application uses the following connect descriptor: // oracle = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=<hostname>)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=<service name>)(SERVER=POOLED))) using System; using Oracle.ManagedDataAccess.Client; class DRCP { static void Main() { string constr = “user id=hr;password=hr;data source=oracle"; OracleConnection con = new OracleConnection(constr); con.DRCPConnectionClass = "GroupA"; con.Open(); con.Dispose(); } }
注意:
ODP.NET管理対象外ドライバでDRCPを使用するには、次の設定が必要です。
.NET構成設定、CPVersion
が2.0
に設定される必要があります。または、
CPVersion
は設定せずに、アプリケーションで使用されるTNS完全ディスクリプタに(SERVER=POOLED)
を設定します。
詳細は、「settingsセクション」を参照してください。
関連項目:
デフォルト接続プールまたはエンド・プールの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。
Oracle MultitenantのDRCP
PDBにDRCPを作成することはできません。DRCPは、CDBにのみ作成でき、すべてのPDB間で共有できます。
ODP.NETはCDB全体で1つのDRCPを持ち、ルート・コンテナに接続するだけで構成および管理(起動、停止または再構成)できます。
構成する場合は、CDBを指すようにセッションを設定して、DRCPプールを開始します。次に例を示します。
alter session set container = cdb$root; execute dbms_connection_pool.configure_pool('SYS_DEFAULT_CONNECTION_POOL'); execute dbms_connection_pool.start_pool();
Oracle Real Application Clusters (RAC)のDRCP
Oracle Real Application Clusters (RAC)環境では、インスタンスにDRCPを作成すると、そのDRCPはOracle RACデータベースのすべてのインスタンスにレプリケートされ、任意のインスタンスを使用して接続プールを管理できます。プール構成に対する変更は、すべてのOracle RACインスタンスで適用されます。
ODP.NETのDRCP制限
ODP.NETは、次のDRCPの機能はサポートしません。
エンド・ユーザー認証を使用したプロキシ接続のオープン
sysoper
接続のオープン
OpenWithNewPassword
を使用したオープン
SQLNET.AUTHENTICATION_SERVICES
パラメータ値のnts
への設定(これにより、Microsoft Windowsネイティブのオペレーティング・システム認証が有効になります)
.NET Framework 4より前の.NET Frameworkバージョン
Oracle Database 12cでは、Oracle Multitenantが導入され、これにより、スキーマ、スキーマ・オブジェクト、非スキーマ・オブジェクトのポータブル・コレクションをOracle Database内に構成し、これらを個別のデータベースとしてODP.NETに表示することができます。この自己完結型コレクションは、プラガブル・データベース(PDB)と呼ばれます。
Oracle Multitenantは、顧客がアプリケーションを変更することなく、複数のプラガブル・データベースを簡単に統合できるデータベース・アーキテクチャです。このアーキテクチャにより、多数のデータベースを1つのデータベースとして管理する利点をすべて提供しつつ、別々のデータベースの独立性およびリソース優先度付けを維持します。また、Oracle Multitenantは迅速なプロビジョニングおよびアップグレードを可能にし、他のOracleデータベース・オプションを完全に補完します。
管理対象および管理対象外のODP.NETは、Oracle Multitenantを完全にサポートします。個々のプラガブル・データベースに接続できることに加えて、ODP.NETは拡張されて、アプリケーションが同じ接続プールから特定のPDBに対して接続をリクエストおよび取得できるようになりました。アプリケーションは、同じコンテナ・データベース(CDB)の一部であるPDBのどれにでも接続でき、同じ共通ユーザーを持つ必要があります。また、接続がOracle Real Application Clustersなどで複数のインスタンスにまたがる場合、すべてのインスタンスは、共通ユーザーが接続するためにまったく同じPDBおよびサービスを一様に持つ必要があります。こうした条件が満たされると、ODP.NETは同じプール内の1つのPDBから別のPDBへの接続を、非常に効率的な方法で接続または暗黙的に切り替えることができます。
特定のPDBへの接続を(共通ユーザーとして)確立するには、OracleConnections
プロパティ、PDBName
およびServiceName
を設定してから、OracleConnection.Open()
を呼び出して、指定したPDBおよびサービス名への接続を確立します。PDBName
およびServiceName
は、接続プールからの既存のアイドル接続を使用する場合に、接続の確立または切り替えが必要なPDBおよびサービスを識別します。これらは、それぞれプラガブル・データベース名およびデータベース・サービス名です。PDBName
プロパティのみが設定されていて、サービス名が設定されていない場合、プロバイダはデフォルト(管理)・サービスを使用する接続を戻します。
注意:
ODP.NETでは、管理対象外ドライバは同じプール内でPDB接続を切り替えることができます。
.NET構成設定、CPVersion
が2.0
に設定される必要があります。または、
CPVersion
は設定せずに、指定された接続文字列の接続要求に対してPDBName
またはServiceName
(あるいはその両方)にNULL以外/空以外の値を設定します。
詳細は、「settingsセクション」を参照してください。
例3-2 プラガブル・データベースの使用: サンプル・コード
// C# using System; using Oracle.ManagedDataAccess.Client; class PDB { static void Main() { string constr = “user id=hr;password=hr;data source=oracle”; OracleConnection con = new OracleConnection(constr); con.PDBName = "pdb1"; con.ServiceName = "db1.company.com"; con.Open(); con.Close(); } }
ODP.NETは、プールされた接続が確立されているPDBName
およびServiceName
を追跡します。アプリケーションが指定されたPDBName
およびServiceName
で接続を要求すると、ODP.NETは要求と一致する接続を戻します。ただし、一致する接続が見つからない場合、ODP.NETは新しい接続を作成またはセッションを変更(あるいはその両方)を行って、要求されたPDBName
およびServiceName
に切り替えます。PDBName
またはServiceName
(あるいはその両方)が変更されている場合、SwitchedConnection
プロパティは、Open()
メソッドの起動で呼び出されると、trueを戻します。
ODP.NETでは、プロセスの存続中にALTER SESSION
文を使用してエディションベースの再定義でエディションを変更することはサポートされていません。Oracle Continuous Query NotificationでPDBを使用している場合、Oracle Database 12cリリース2以上に接続する必要があります。同じプールから複数のPDBへの接続をホストするには、ODP.NET for .NET Framework 4以上が必要です。
注意:
あるPDB/サービスから別のPDB/サービスに接続が暗黙的に切り替えられている場合、サービス再配置接続タイムアウト(SRCT)は有効になりません。
関連項目:
『Oracle Database管理者ガイド』のプラガブル・データベースの管理に関する説明を参照
エディションベースの再定義を使用すると、アプリケーションが使用中であってもそのデータベース・コンポーネントをアップグレードできます。このため、アプリケーションの停止時間を最小化あるいは排除することができます。
ODP.NETでは、プロセスの存続期間中にALTER SESSION
文を使用してエディションを変更することはサポートされていません。
管理対象および管理対象外ODP.NETはデータベース・エディションに接続でき、同じプール内の複数のエディションへの接続をホストすることもできます。ODP.NETアプリケーションは、OracleConnection.DatabaseEditionName
プロパティを接続が関連付けられるデータベース・エディションの名前に設定することで、指定されたデータベース・エディションに関連付けられている接続を取得できます。単一のプールを使用するには、同じユーザーが両方のエディションに接続できる必要があります。ODP.NETは同じ接続プールを使用でき、エディション固有のプロパティを変更するだけで同じOracleConnection
オブジェクトを共有することもできるため、エディションを使用するとアプリケーションのパフォーマンスが向上し、効率的になります。
例3-3 エディションベースの再定義の使用: サンプル・コード
using System; using Oracle.ManagedDataAccess.Client; class Editions { static void Main() { // Create a connection string constr = “user id=hr;password=hr;data source=oracle”; OracleConnection con = new OracleConnection(constr); // Obtain a connection associated with EditionX con.DatabaseEditionName = "EditionX"; con.Open(); // Obtain a connection associated with EditionY con.Close(); con.DatabaseEditionName = "EditionY"; con.Open(); con.Dispose(); } }
接続をオープンしている間にDatabaseEditionName
を使用してエディション名を変更することはできません。接続がクローズ状態のときに変更する必要があります。
ODP.NETは、Oracle Database 11gリリース2以上に接続する場合にエディションをサポートします。同じプールで複数のエディションをホストすることは、ODP.NET for .NET Framework 4以上でのみ可能です。
注意:
管理対象外ODP.NET接続プールでこのエディションベースの再定義機能を使用するには、次の設定が必要です。
.NET構成設定、CPVersion
が2.0
に設定される必要があります。または、
CPVersion
は設定せずに、指定された接続文字列の接続要求に対してDatabaseEditionName
プロパティにNULL以外/空以外の値に設定します。
詳細は、「settingsセクション」を参照してください。
アプリケーションは、レジストリまたは構成ファイルを使用して、デプロイメント時にエディションを指定できます。アプリケーションは、タイプREG_SZ
の次のレジストリ・エントリを作成できます。
HKLM\Software\Oracle\ODP.NET\version\Edition
ここで、version
はODP.NETのバージョン、Edition
はエディションの有効な文字列値です。
アプリケーションは、かわりにweb.config
またはapplication.config
構成ファイルを使用して、デプロイメント時にエディションを指定できます。machine.config
構成ファイルを使用すると、特定のバージョンの.NET frameworkを使用するすべてのアプリケーションに対してエディションを指定できます。
次の例では、ODP.NET管理対象外ドライバの.NET構成ファイルでエディションをE1
に設定します。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <oracle.dataaccess.client> <settings> <add name="Edition" value="E1"/> </settings> </oracle.dataaccess.client> </configuration>
まとめると、エディション名は.NET構成ファイルまたはWindowsレジストリのDatabaseEditionName
プロパティで設定することができます。DatabaseEditionName
が設定されている場合、他の2つの設定より優先されます。.NET構成ファイルにエディションが設定されている場合、レジストリよりも優先されます。
関連項目:
エディションの詳細は、『Oracle Database管理者ガイド』および『Oracle Database開発者ガイド』を参照
Oracle Databaseは、Windowsのユーザー・ログイン資格証明を使用してデータベース・ユーザーを認証できます。Windowsのユーザー・ログイン資格証明を使用して接続をオープンするには、User
Id
接続文字列属性をスラッシュ(/)
に設定する必要があります。Password
属性を指定しても無視されます。
注意:
オペレーティング・システム認証は、.NETストアド・プロシージャではサポートされません。
オペレーティング・システム認証を使用する接続を含む、すべてのODP.NET管理対象外ドライバ接続がプールできます。ODP.NET管理対象ドライバは、WindowsドメインがKerberosベースのドメイン認証のみをサポートするように制限されている場合を除き、オペレーティング・システム認証をサポートします。プーリングが有効になっている間は、デフォルトで接続はプールされ、構成は必要ありません。
オペレーティング・システム認証の使用例を次に示します。
/* 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"); } }
関連項目:
データベースでの特権接続の詳細は、表6-33の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"); } }
関連項目:
ALTER
USER
文のプロキシ句の説明と構文は、Oracle Database SQL言語リファレンスを参照
SQL文に対する監査の動作と、多層環境における権限については、Oracle Databaseセキュリティ・ガイドを参照
OracleConnection
オブジェクトのEnlistDistributedTransaction
を使用して分散トランザクションに動的に登録するアプリケーションでは、"Enlist"
接続文字列属性の値を"true"
に設定する必要があります。"Enlist=true"
の場合、COM+トランザクションまたはSystem.Transactions
のコンテキスト内でOracleConnection
オブジェクトに対してOpen
メソッドがコールされると、接続がトランザクションに登録されます。そうでない場合、OracleConnection
オブジェクトは分散トランザクションに登録されませんが、後でEnlistDistributedTransaction
またはEnlistTransaction
メソッドを使用して明示的に登録できます。"Enlist
"が"false
"または"dynamic
"の場合、接続はトランザクション内に登録できません。ODAC 12cリリース3のODP.NET管理対象外ドライバは、"Enlist=dynamic
"用にこの新しい動作を最初に導入しました。
クライアント識別子は、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などの機能ブロックを指定します。
関連項目:
エンドツーエンド・アプリケーションのトレースの概要は、Oracle Database SQLチューニング・ガイドを参照
『Oracle Databaseセキュリティ・ガイド』
透過的アプリケーション・フェイルオーバー(TAF)は、高可用性を提供するOracle Databaseの機能です。
注意:
ODP.NET管理対象ドライバは、TAFおよびTAFコールバックをサポートしていません。
TAFを使用すると、接続が継続していれば、別のデータベース・インスタンスに自動的に再接続できます。アクティブなトランザクションはロールバックされますが、別のノードを経由した新しいデータベース接続は、元の接続と同一です。これは、接続が失敗した方法に関係なく当てはまります。
TAFを使用すると、アプリケーションを提供するインスタンスが1つ残っているかぎり、クライアントで接続が失われることはありません。データベース管理者は、インスタンスで実行されるアプリケーションを制御して、各アプリケーションのフェイルオーバー命令も作成します。
別のデータベースにセッションがフェイルオーバーした場合、元のセッションで最初に設定されていたNLS設定は、新しいセッションに引き継がれません。したがって、これらのNLS設定は、アプリケーション側で新しいセッションに設定する必要があります。
フェイルオーバーによる遅延を考慮して、アプリケーションではTAFコールバックによる通知を必要とします。ODP.NETは、OracleConnection
オブジェクトのFailover
イベントによるTAFコールバック機能をサポートしています。これにより、フェイルオーバーが発生したときは常にアプリケーションに通知されます。TAFコールバックを受信するには、Failover
イベントにイベント・ハンドラ関数を登録する必要があります。
フェイルオーバーが発生すると、Failover
イベントが発生し、別のOracleインスタンスに接続を再確立する過程で、イベント・ハンドラが複数回起動されます。
イベント・ハンドラの最初のコールは、Oracleデータベースがインスタンス接続の損失を最初に検出したときに行われます。これにより、アプリケーションはフェイルオーバーの次の遅延に応じて動作します。
フェイルオーバーが成功した場合、接続が再確立されて使用可能になったときにFailover
イベントが発生します。この時点で、アプリケーションはOracleGlobalization
セッション設定を再同期化して、フェイルオーバーが発生したことをアプリケーション・ユーザーに通知できます。FailoverEvent.Begin
イベントの直後には、大きいデータベース操作が発生しません。SQLと主なデータベース操作は、FailoverEvent.End
イベントまで待つようにしてください。FailoverEvent.Begin
は主として、フェイルオーバーを拒否するか、またはフェイルオーバーをトレースするために使用されます。FailoverEvent.Begin
は、フェイルオーバーが進行中であり、完了を待ってから続行するようエンド・ユーザーに告知するなど、データベース以外のアプリケーション操作にも使用されます。トランザクションは、フォルト・チケットの発行や監査など、FailoverEvent.End
コールバック・フェーズで使用できます。これらのトランザクションは、コールバックが完了する前にコミットする必要があります。
フェイルオーバーが失敗した場合、フェイルオーバーが発生しなかったことをアプリケーションに通知するために、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
イベント・ハンドラが登録されていても、最後に登録されたイベント・ハンドラのみが起動されます。
注意:
フェイルオーバーが有効な環境では、分散トランザクションはサポートされません。
関連項目:
Oracle Database Net Services管理者ガイド