プライマリ・コンテンツに移動
Oracle® Data Provider for .NET開発者ガイド
ODAC 12.2c リリース1 (12.2.0.1) for Microsoft Windows
E88311-03
目次へ移動
目次
索引へ移動
索引

前
次

Oracle Databaseへの接続

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

Oracle Database Exadata Express Cloud Serviceへの接続

管理対象および管理対象外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)
    • 計画済停止、実行時接続ロード・バランシング、高速接続フェイルオーバーなどFANに依存する機能はサポートされません。

    • ODP.NET 12.1以下では、FANを有効にすると、ODP.NETアプリケーションでエラーが発生します

  • シャーディング

接続文字列属性

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

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

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

Application Continuity

データベース・セッションが切断され、リカバリ可能なエラーになった場合に、トランザクションおよび非トランザクション操作を、データベース・リクエストで自動的に非破壊的かつ迅速にリプレイできます。

ODP.NET管理対象ドライバでは使用できません

true

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データベース・サービス、サービス・メンバー、インスタンスまたはノードの停止時に、プールから接続を事前に削除できます。Oracle RAC、Data Guard、GoldenGateなどの単一インスタンスへのデプロイを含め、Oracle Global Data Servicesを扱います。

true

Load Balancing

ODP.NET接続プールを使用して、ロード・バランシング・アドバイザリおよびサービスの目的に基づき、Oracleデータベース・インスタンス間の作業要求のバランスを調整できます。Oracle RAC、Active Data Guard、GoldenGateなどを含め、Oracle Global Data Servicesを扱います。

true

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");
  }
}
 

関連項目:

接続文字列ビルダー

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別名の使用

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管理者ガイド』を参照

LDAPの使用

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セキュリティ・ガイドを参照してください。

データ・ソース列挙子

データ・ソース列挙子では、アプリケーションによって、そのアプリケーションが接続できるOracleデータ・ソースのコレクションを一般的に取得できます。

Transport Layer SecurityとSecure Sockets Layerの使用

Transport Layer Security (TLS)とその前身であるSecure Sockets Layer (SSL)は、ネットワーク接続を保護する業界標準プロトコルです。管理対象および管理対象外のODP.NETはどちらも、データベースとトランスポートの認証でSSLに対応しています。

Secure Sockets LayerとTransport Layer Securityの差異

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_MATCHTrue (またはOnYes)に設定します。SSL_SERVER_CERT_DNはオプションです。管理者が、一致させたいDNを正確に指定できます。SSL_SERVER_CERT_DNが設定されていない場合、SERVICE_NAME値と、サーバー証明書のDNの共通名(CN)部分とを比較して一致が実行されます。

関連項目:

注意:

SSLが最も広く認識されている用語であるため、SSLでもTLSでも該当する場合、この項では説明を簡単にするためにSSLという用語を使用します。ただし、これらのプロトコルの使用方法または構成方法に違いがある場合、この項では、記述内容がSSLに該当するか、TLSに該当するかを明記します。

ODP.NET Secure Sockets Layerの構成

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.configweb.congigまたはmachine.configファイルを介して設定できます。通常、このパラメータを設定する必要はありません。このパラメータのデフォルト設定はanyで、データベース・サーバーがあらゆる必要な制限を認証されているSSLバージョンに適用できるようにします。次にsqlnet.oraの設定例を示します。

SSL_VERSION=3.0

手順5: クライアントにおける認証サービスとしてのSSLの設定(オプション)

sqlnet.oraまたはapplication.configweb.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設定のトラブルシューティング

この項では、よく発生する問題点と、それを解決する一般的な手順について説明します。

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を使用できます。

  1. ルート・ウォレット、たとえばCAウォレットを作成します。

    orapki wallet create -wallet ./root -pwd <password>
  2. 自己署名証明書(CA証明書)をルート・ウォレットに追加します。

    orapki wallet add -wallet ./root -dn 'CN=<my root>' -keysize 1024 -self_signed -validity 3650 -pwd <password> -sign_alg sha512
  3. 自己署名済証明書をウォレットからエクスポートします。

    orapki wallet export -wallet ./root -dn 'CN=<my root>' -cert ./root/b64certificate.txt -pwd <password>
  4. ユーザー・ウォレット、たとえば顧客ウォレットを作成します。

    orapki wallet create -wallet ./user -pwd <password> -auto_login
  5. 証明書リクエストの追加

    orapki wallet add -wallet ./user -dn 'CN=<client's hostname>' -keysize 1024 -pwd <password> -sign_alg sha512
  6. 証明書リクエストをエクスポートします。

    orapki wallet export -wallet ./user -dn 'CN=<client's hostname>' -request ./user/creq.txt -pwd <password>
  7. CAによって発行された証明書を作成します。

    orapki cert create -wallet ./root -request ./user/creq.txt -cert ./user/cert.txt -validity 3650 -pwd <password> -sign_alg sha512
  8. 信頼できる証明書(CA証明書)をウォレットに追加します。この例では、クライアントとサーバーの両方のウォレットに同じCAを使用すると想定しています。

    orapki wallet add -wallet ./user -trusted_cert -cert ./root/b64certificate.txt -pwd <password>
  9. 新しい証明書を追加します。

    orapki wallet add -wallet ./user -user_cert -cert ./user/cert.txt -pwd <password> -sign_alg sha512
  10. ユーザー・ウォレットの内容を表示します。

    orapki wallet display -wallet ./user -pwd <password>
  11. サーバー・ウォレットを作成します。

    orapki wallet create -wallet ./server -pwd <password> -auto_login
  12. サーバー証明書リクエストを追加します。

    orapki wallet add -wallet ./server -dn 'CN=<server's hostname>' -keysize 1024 -pwd <password> -sign_alg sha512
  13. 証明書リクエストをエクスポートします。

    orapki wallet export -wallet ./server -dn 'CN=<server's hostname>' -request ./server/creq.txt -pwd <password>
  14. CAによって発行されたサーバー証明書を作成します。

    orapki cert create -wallet ./root -request ./server/creq.txt -cert ./server/cert.txt -validity 3650 -pwd <password> -sign_alg sha512
  15. 信頼できる証明書(CA証明書)をサーバー・ウォレットに追加します。この例では、クライアントとサーバーの両方のウォレットに同じCAを使用すると想定しています。

    orapki wallet add -wallet ./server -trusted_cert -cert ./root/b64certificate.txt -pwd <password>
  16. サーバー・ウォレットのuser_cert証明書を追加します。

    orapki wallet add -wallet ./server -user_cert -cert ./server/cert.txt -pwd <password> -sign_alg sha512
  17. サーバー・ウォレットの内容を表示します。

    orapki wallet display -wallet ./server -pwd <password>

セキュアな外部パスワード・ストアの使用

安全性の高い外部パスワード・ストア(SEPS)は、パスワードの資格証明を安全に格納するクライアント側ウォレットの使用です。ODP.NET管理対象ドライバおよび管理対象外ドライバの両方について、外部パスワード・ストアを使用するように構成できます。

Oracleウォレットは、認証および署名用資格証明を安全に格納するコンテナです。ウォレットにより、データベース接続をパスワード資格証明に依存する大規模なデプロイメントを簡素化できます。アプリケーションでは、埋込みユーザー名およびパスワードが必要なくなり、これによりセキュリティ・リスクを減らします。

セキュアな外部パスワード記憶域(SEPS)の構成

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の使用

Kerberosは、分散環境におけるセキュリティのためのネットワーク認証サービスです。ODP.NETアプリケーションは、シングル・サインオンと一元的なユーザー認証の目的でKerberosを使用できます。ODP.NET管理対象外ドライバおよび管理対象ドライバは両方ともデータベース・サーバーに対する外部認証としてKerberosをサポートします。

ファイル・ベース資格証明キャッシュおよびMSLSA

ODP.NETは、ファイル・ベースKerberosクライアント資格証明キャッシュ(CC)およびKerberosクライアント資格証明としてWindowsログオン資格証明を使用する機能の両方をサポートします。後者はMSLSAベースKerberos認証と呼ばれます。

ファイル・ベースKerberosクライアント資格証明キャッシュ(CC)を使用するには、Oracle Call Interface (OCI)のフル・インストールに関連付けられている次の実行ファイルが必要です。

  • okinit.exe

  • oklist.exe

  • okdstry.exe

Kerberos5資格証明を入手し、ファイル・ベース資格証明キャッシュ(CC)に格納するためにこの実行ファイルが必要です。ただし、資格証明キャッシュを作成後、資格証明が有効であるかぎり、前述の実行可能ファイルは実行時にODP.NETアプリケーションでは不要になります。

MIT Kerberosでの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認証の構成に関する項を参照してください。

ODP.NETでの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認証の構成トピック:

手順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ネイティブ認証(NTS)の使用

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クライアントのWindowsネイティブ認証(NTS)の構成

ODP.NETクライアントのNTSを構成する手順:

手順1:OSAUTH_PREFIX_DOMAINが正しく設定されていることを確認します

OSAUTH_PREFIX_DOMAINが適切に設定されていることを確認します。外部で識別されたユーザーIDがドメインを含めるようにするには、trueに設定します。それ以外の場合はfalseに設定します。パラメータはHKLM/software/oracle/HOME<ORACLE_SID>にあるレジストリ設定です。たとえば、ORACLE_SIDr1の場合、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メソッドが戻すメタデータを拡張またはカスタマイズできます。

これを行うには、開発者はカスタマイズしたメタデータ・ファイルを作成し、アプリケーションにファイル名を提供する必要があります。方法は次のとおりです。

  1. カスタマイズしたメタデータ・ファイルを作成し、それを.NET FrameworkがインストールされたCONFIGサブディレクトリに置きます。これは、machine.configおよびセキュリティ設定があるディレクトリです。

    このファイルには、変更のみではなく、スキーマ設定情報のセット全体を含める必要があります。開発者は、ユーザー固有の要件を検索するスキーマ動作の変更を提供します。たとえば、開発者は内部データベース表にフィルタをかけ、ユーザー固有の表のみを検索できます。

  2. 次と同じく、アプリケーションの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ファイルをロードします。

関連項目:

GetSchema

接続プーリング

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以下では、一致する必要があるのは接続文字列の属性値のみでした。現在は、接続文字列そのものが完全一致する必要があります。同じ接続に対して異なる順序で指定したキーワードは、別々にプールされます。要求された署名を持つプールがすでに存在する場合、接続はそのプールからアプリケーションに戻されます。

接続プールが作成されると、接続プーリング・サービスは、ConnectionStringMin 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 接続プーリングのパフォーマンス・カウンタ

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

なし

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または.NET構成ファイルを使用します。このレジストリ値は次のようになります。

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\Assembly_Version

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

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

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

.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構成設定、CPVersion2.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マルチテナントおよびプラガブル・データベース

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構成設定、CPVersion2.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構成設定、CPVersion2.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メソッドを呼び出すと接続プールがクリアされます。その結果、古いパスワードで作成されたアイドル接続はすべてクローズされます。

関連項目:

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プロパティを設定できます。接続プーリングが有効な場合、プールに接続が戻されると、常にClientIdnullにリセットされます。

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

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

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

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

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

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

関連項目:

  • OracleConnectionプロパティ

  • エンドツーエンド・アプリケーションのトレースの概要は、Oracle Database SQLチューニング・ガイドを参照

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

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

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

注意:

ODP.NET管理対象ドライバは、TAFおよびTAFコールバックをサポートしていません。

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

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

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

TAF通知

フェイルオーバーによる遅延を考慮して、アプリケーションでは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イベント・ハンドラが登録されていても、最後に登録されたイベント・ハンドラのみが起動されます。

注意:

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

関連項目: