※本記事は、Stephen Feltsによる”ATP Database use with WebLogic Server“を翻訳したものです。


このブログでは、WebLogic Server(WLS)データソースと組み合わせた、オラクルのAutonomous Transaction Processing(ATP)サービスの使用について解説します。この点について扱ったドキュメントはさまざまなソースから公開されていますが、この記事ではWLSに絞って情報をまとめ、オラクルのお客様が直面してきた問題に対するソリューションを紹介します。この記事では、特にATP-Sについて解説しています(ATP-DやRACベースのバージョンではありません)。

 

はじめに:

ATPの概要は、Oracle CloudのATPのページでご覧になれます。ATPについてさらに詳しく説明したドキュメントには、ATPのユーザー・ガイドがあります。  

Configuring a WebLogic Data Source to use ATPというブログでは、OCIコンソールからATPデータベースを新規作成する場合のスクリーンショットが掲載されており、データベースのADMINユーザーのパスワードと、クライアント資格証明ウォレットのパスワードを設定しています。今回の記事は、その手順をすでに完了し、ウォレットのZIPファイルをダウンロード済みであることを前提としています。統一を取るために、このブログでは/shared/atpに保存されているウォレット・ファイルと同じディレクトリ構造を使用します。WLSで使用するためにそれらのファイルを変更する必要はありません(1つだけ例外がありますが、後ほど説明します)。ファイルの使用については、データソースの構成と関連させて、この後詳しく解説します。必要な情報は、tnsnames.oraファイルにあるエイリアス名だけです。WLSでは、「dbnnnnnnnnnnnn_tp」という形式のエイリアス名を使用する必要があります。このサービスは、WLSのトランザクション処理を適切に実行できるように構成されます。

前述のリンク先のブログには、WLS管理コンソールを使用して、ATPデータベース向けのWLSデータソースを作成する際のスクリーンショットが掲載されています。コンソールを使用するときには、こちらのプロパティの暗号化に関するブログで説明されている手順でJKSパスワードを暗号化できます。

このブログには、オンラインのWLSTまたはRESTを使用してデータソースを作成するための実用的なスクリプトが掲載されています。スクリプトを実行する前に、いくつかの前提条件を確認しましょう。

19.3のドライバが付属し、JDK 8をサポートするWebLogic Serverのリリース12.2.1.4.0および14.1.1.0.0であれば、ATPをそのまま使用できます。もっともシンプルなプラットフォームで開始するために、上記のいずれか、またはそれ以降のリリースを使用することをお勧めします。この後のセクションでは、ATPを実行するための要件を説明します。

 

動作保証

WebLogic Server12.2.1.3.0以降であれば、ATPの動作が保証されています。この後のセクションでは、現在動作保証またはサポートされていない古いバージョンを使用する場合の情報が掲載されていることがあります。

 

JDKの前提条件:

WebLogic Server 12.1.3以降ではJDK 8がサポートされています。`java -version`を実行してJDKのアップデート番号を確認し、1.8.0_169以降であることを確かめてください。JDK 8の年4回のCPUに追いついていない場合(困ったことですが)は、少なくともアップデート169か、それ以降をインストールするか(こちらを強く推奨します)、JCE Unlimited Strength Jurisdiction Policy Files 8をダウンロードします。関連するREADMEファイルで、インストールの注意事項を確認してください。そうしないと、データベースに接続するときに’fatal alert: handshake_failure’と表示されてしまいます。 

WebLogic Server 10.3.6~12.1.2は、JDK 7で動作します(JDK 8はサポートされていません)。JDK 7で実行する場合は、JCE Unlimited Strength Jurisdiction Policy Files 7をダウンロードしてインストールする必要があります。

 

JDBCドライバの前提条件:

WLS 12.2.1.3.0には、12.2.0.1のOracleドライバが付属します。このドライバを使用するにあたっての特別な要件はありません。また、サンプルのスクリプトを変更せずに使用できます。そのため、構成(と認証)がシンプルです。この場合は次のセクションに進んでかまいません。

WLSバージョン12.1.3~12.2.1.2.0には、12.1.0.2のOracleドライバが付属します。WLSバージョン10.3.6~12.1.2には、11.2.0.3のドライバが付属します。11.2.0.3のドライバは、18cおよび19cのデータベース・サーバーで使用できます。こちらのリンクにある情報を参考にして、11.2.0.3ドライバを12.1.0.2ドライバにアップグレードできます(ドライバのアップグレードがサポートされるのはWLSのみで、JRFとFAは非対応です)。11.2.0.3と12.1.0.2のドライバでTLSv1.2をサポートするには、wlserver_10.3/server/lib/ojdbc7.jarにパッチを適用する必要があります。こちらのリンクを参照してjarファイルをダウンロードするか、バグ23176395にパッチを適用してください。詳細については、MOS note 2122800.1を参照してください。

12.2.xより前のドライバを使用する場合は、サンプルのスクリプトからも分かるように、SSLを構成するためのドライバ接続プロパティの使用はサポートされていません(スクリプトから削除する必要はありません。無視されます)。代わりに、こちらのリンクで説明されているように、コマンドライン・システムのプロパティを使用する必要があります。たとえば、-Doracle.net.tns_admin=<クライアント資格証明への絶対パス>、-Doracle.net.wallet_location=file://<クライアント資格証明への絶対パス>、-Doracle.net.ssl_version=1.2をJVM引数として設定します。

11gで動作しているFMW/FAの場合は、ojdbc7.jarはwlserver_10.3/server/lib/ojdbc7.jarにあり、ojdbc7dms.jarはmodules/oracle.jdbc_11.1.1/ojdbc7dms.jarにあります。更新された18c/19cバージョンのoraclepki.jar、osdt_core.jar、osdt_cert.jarを、oracle_common/modulesディレクトリにコピーする必要もあります(たとえば、18.3ドライバのjarファイルは、https://www.oracle.com/database/technologies/appdev/jdbc-ucp-183-downloads.htmlからダウンロードできます)。また、新しいセキュリティ・プロバイダとして、oracle.secruity.pki.OraclePKIProviderを3番目の位置でjdk1.7/jre/lib/security/java.securityに追加します(これでSSOまたはPKCS12ウォレットを使用できます)。

 

HTTPプロキシのサポート:

HTTPプロキシの構成などの比較的新しい機能を使用する場合は、Oracleドライバのjarファイルを新しいバージョン(18c以降)に更新できますし、更新が要求される場合もあります。この場合、JDK 8を実行する環境が必要になります。

クライアントがファイアウォールで保護されていて、HTTPプロキシをインターネットに接続する必要があるネットワーク構成の場合は、2つの選択肢があります。まず、ネットワーク管理者に頼んで、HTTPプロキシを経由せず、ポート1522を使用してoraclecloud.comドメインのホストにアウトバウンド接続してもらう方法があります。JDK 8で動作している場合のもう1つの選択肢は、Oracle 18c以降のJDBCシン・クライアントにアップグレードすることです。そうすると、HTTPプロキシ経由の接続が有効になります。jarファイルの入手とCLASSPATH/PRE_CLASSPATHの更新の方法については、Oracle 18.3 Database Support with WebLogic Serverのブログを参照してください。さらに、dbnnnnnnnnnnnn_tpを更新する必要があります。tnsnames.oraファイルのサービス・エントリを更新して、”address=”を”address= (https_proxy=proxyhostname)(https_proxy_port=80)”に変更します。そうしないと、データベースへの接続がハングしたり、ホストが見つからなかったりします。

 

WLSまたはRESTを使用した構成:

これで、必要な資格証明ファイル、JDK、ドライバのjarファイルがそろい、データソースを作成する準備ができました。

オンラインWLSTのスクリプトは、こちらのオンラインWLSTのスクリプトへのリンクから入手できます。サーバーが適切なJDKとドライバのjarファイルで起動している場合、以下を実行するだけで、スクリプトを実行できます。

java weblogic.WLST online.py

RESTスクリプトは、こちらのRESTスクリプトへのリンクから入手できます。サーバーが起動している場合、ドメインのホーム・ディレクトリから以下を実行するだけで、スクリプトを実行できます。

sh ./rest.sh

どちらのスクリプトも、同じデータソース記述子ファイルを作成し、データソースをサーバーに展開します。記述子を見て、データソースの構成を確認してみましょう。各スクリプトで設定する必要のある変数は一番上にあるので、ロジックを変更することなく、すぐにスクリプトを更新できます。WLSTはpython変数を、RESTスクリプトはshell変数を使用しています。 

dbnnnnnnnnnnnn_tpという形式のエイリアス名(変数はserviceName)は、tnsnames.oraファイルから取得されます。URLは@aliasの形式である”jdbc:oracle:thin:@dbnnnnnnnnnnnn_tp”を使用して生成されます。そのためには、oracle.net.tns_adminのドライバ・プロパティを使用して、tnsnames.oraファイルがあるディレクトリを指定する必要があります(変数はtns_admin)。   tnsnames.oraのURL情報は長い形式を使用しているため、プロトコルをTCPSに指定できます。

また、データソース名(変数はdsname)がJNDI名の生成に使用され、サンプルでは”jndi.”が先頭に付けられています。これはアプリケーションの要件に応じて変更できます。

テストとパフォーマンスを最適なものとするために、テスト用の表の名前は”SQL ISVALID”とすることをお勧めします。社内の標準をベースにして、他の接続プールのパラメータを設定することもできます。

ATP(ATP-S)の最新バージョンでは、コンテナ・データベース(CDB)のプラガブル・データベース(PDB)の1つにアクセスできます。PDBでの操作の多くは、通常のオラクル・データベースの場合と同様です。ADMINというユーザーがあり、SYSDBAロールはありませんが、いくらかの管理権限が付与されていて、スキーマ・オブジェクトの作成や権限の付与などが可能です。セッションの数は100 * ATPコア数に設定されています。表領域を作成することはできず、デフォルトで使用できる表領域にはDATA、一時表領域にはTEMPという名前が付けられています。ブロック・サイズは8kに固定されているため、サイズが概算で6kを超える索引を作成することはできません。   制限に関するその他の情報は、Autonomous Transaction Processing for Experienced Oracle Database Usersで参照できます。

ATPは、GRIDやRACがインストールされない構成になっています。つまりFANがサポートされておらず、WLS GENERICデータソースのみを作成できます(マルチ・データソースとActive GridLinkは使用できません)。ドライバがONSサーバーからFANイベントを取得しようとする場合がありますが、構成されていないため取得できません。この状況を回避するには、ドライバ・プロパティのoracle.jdbc.fanEnabled=falseを設定する必要があります。18c以降のドライバを使用している場合は、このプロパティは不要です。

接続を作成するには、データソースのユーザーとパスワード(変数名はuserとpassword)を指定する必要があります。サンプルでは、データベースの作成時に構成されたAdminユーザーを使用しています。大抵はアプリケーションを使用するために、追加のユーザーを作成することになります。SQLPlusなどの任意のツールを使用してスキーマ・オブジェクトを作成するか、WLS utils.Schemaを使用してオブジェクトを作成できます。関連するSQL DDL文については、ユーザー・ガイドのこちらのリンクで説明されています。データソースの記述子では、パスワードは暗号化されます。
 
構成の残りの部分では、おもにクライアントとデータベース間の双方向SSLを設定します。これを構成するには2つのオプションがあり、両方ともウォレットのZIPファイルに資格証明があります。

どちらのオプションの場合でも、2つのドライバ・プロパティを設定します。

oracle.net.ssl_server_dn_match=true
oracle.net.ssl_version=1.2(12.xドライバの場合のみ必要)

最初のオプションは、オラクルの自動オープンのSSOウォレットであるcwallet.oraを使用することです。このウォレットを使用して、データベースへの双方向SSL接続の情報を指定します。これは、データベースのユーザー/パスワードの資格証明を格納するためのウォレットの使用とは異なるもので、資格証明の場合は、データソースの記述子から削除できます(ウォレットのブログで説明されています)。このオプションを使用する場合、設定する必要があるドライバ・プロパティはoracle.net.wallet_location(変数はwallet_location)で、ウォレットがあるディレクトリを指定します。

2つ目のオプションは、Java KeyStore(JKS)ファイルのtruststore.jksとkeystore.jksを使用することです。このオプションでは、javax.net.ssl.keyStoreType、javax.net.ssl.trustStoreType、javax.net.ssl.trustStore、javax.net.ssl.trustStorePassword、javax.net.ssl.keyStore、javax.net.ssl.keyStorePasswordのドライバ・プロパティを設定する必要があります。また、パスワードの値を暗号化された文字列として保存する必要もあります。

これで、データソースの構成に関する話は終了です。

データベース・サービスでアプリケーション・コンティニュイティを有効にする場合は、ユーザー・ガイドのこちらのリンクで説明されているデータベースの手順を実行する必要があります。

 

既知の問題

ATPを使用するときには、ATP以外のデータベースでは発生しないいくつかの問題が発生する可能性があります。こちらを見ておくと、いくらか時間を節約できるかもしれません。

  1. 12.2.0.1のオラクル・データベース・サーバーで使用される19.3のOracleドライバでは、アプリケーション・コンティニュイティが機能しません。これは19.6のドライバで修正されています。
  2. oracle.sql.Blobのオブジェクトは、19.3のOracleドライバではシリアライズできません。次のシーケンスは失敗します。

    Blob blob = BLOB.getEmptyBLOB();
    ObjectOutputStream oos = new ObjectOutputStream(new ByteArrayOutputStream());
    oos.writeObject(blob);

    この問題は、Blobの値を使用しているWebLogicジョブ・スケジューラで発生しました。oracle.sql.BLOB.empty_lob()ではなくConnection.createBlob()を使用することで、この問題を回避できました(WebLogic 14.1.1.0.0では解決されていますが、WebLogic 12.2.1.4.0では解決されていません)。

    この問題は19.6のOracleドライバで修正されました。

  3. コアあたりのセッション数が100に制限されており、セッションの最大数に到達すると”no more data to read from socket”というエラーが発生するのを解決することは困難です。
  4. “_tp”サービスではなく”_high”サービスを使用していると、AWRレポートでいくつかの経過時間が非常に長くなることが確認されました。上記で説明されているように、”_tp”サービスを使用してください。
  5. ATP-Sにはリスナーの速度制限があり、1秒あたりの接続数を100までとして、接続リクエスト数を調整しています(ATP-Sは共有リソースであるため)。一般的にWebLogic Serverでこれが問題となるのは、接続の最低数を100よりも大きい値にしてデータソースを初期化する場合のみです。そのため、これを回避する方法の1つは、最低数の値を100より少ない数に設定することです。WebLogic Server 12.2.1.4.0では、接続を作成できるスレッドの最大数を制限するために、weblogic.jdbc.maxConcurrentCreateRequestsとweblogic.jdbc.concurrentCreateRequestsTimeoutSecondsというドライバ接続プロパティが追加されました(詳しくはドキュメントを参照してください)。