Fusion Middleware mod_plsqlユーザーズ・ガイド

11gリリース1(11.1.1)

B56249-03(原本部品番号:E12041-03)

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

1 mod_plsqlの構成

- 1.1 前提条件の確認

- 1.2 必須パッケージのインストール

- 1.3 mod_plsqlをOracle Portalで使用するための構成

- 1.4 PL/SQLアプリケーション用のDADの構成

- 1.5 mod_plsqlの構成へのアクセス

- 1.6 mod_plsqlの診断結果

2 mod_plsqlを使用したアプリケーション・データベース・アクセスの保護

- 2.1 セキュリティに関する考慮事項

- 2.1.1 mod_plsqlでのPlsqlRequestValidationFunctionディレクティブの定義

- 2.1.2 mod_plsqlでのPlsqlExclusionListディレクティブへのルールの追加

- 2.1.3 カスタム認証でのAUTHORIZEプロシージャの使用

- 2.1.4 データベース表の保護

- 2.1.5 SQLインジェクションからのデータベースの保護

- 2.2 mod_plsqlを使用したユーザー認証

- 2.2.1 Basic(データベース制御認証)

- 2.2.2 Oracle HTTP Server mod_plsqlのBasic認証モード

- 2.2.3 グローバルOWA、カスタムOWAおよびパッケージ別(カスタム認証)

- 2.3 ユーザーの認証解除

3 mod_plsqlの概要

- 3.1 クライアント・リクエストの処理

- 3.2 データベース・アクセス記述子(DAD)

- 3.3 mod_plsqlの実行

- 3.4 トランザクション・モード

- 3.5 サポートされるデータ型

- 3.6 パラメータの受渡し

- 3.6.1 名前によるパラメータの受渡し(パラメータのオーバーロード)

- 3.6.2 柔軟なパラメータの受渡し

- 3.6.2.1 2パラメータ・インタフェース

- 3.6.2.2 4パラメータ・インタフェース

- 3.6.3 大きなパラメータの受渡し

- 3.7 ファイルのアップロードとダウンロード

- 3.7.1 ドキュメント表の定義

- 3.7.1.1 CONTENT列のセマンティクス

- 3.7.1.2 CONTENT_TYPE列のセマンティクス

- 3.7.1.3 LAST_UPDATED列のセマンティクス

- 3.7.1.4 DAD_CHARSET列のセマンティクス

- 3.7.2 以前のスタイルのドキュメント表の定義

- 3.7.3 ドキュメントのアップロード/ダウンロードの構成パラメータ

- 3.7.3.1 PlsqlDocumentTablename

- 3.7.3.2 PlsqlDocumentPath(ドキュメント・アクセス・パス)

- 3.7.3.3 PlsqlDocumentProcedure(ドキュメント・アクセス・プロシージャ)

- 3.7.3.4 PlsqlUploadAsLongRaw

- 3.7.4 ファイルのアップロード

- 3.7.5 アップロード・ファイルの属性(MIMEタイプ)の指定

- 3.7.6 複数のファイルのアップロード

- 3.7.7 ファイルのダウンロード

- 3.8 パスのエイリアシング(ダイレクト・アクセスURL)

- 3.9 Common Gateway Interface(CGI)環境変数

- 3.9.1 CGI環境変数の追加およびオーバーライド

- 3.9.2 PlsqlNLSLanguage

- 3.9.2.1 REQUEST_CHARSET CGI環境変数

- 3.9.2.2 REQUEST_IANA_CHARSET CGI環境変数

- 3.10 PL/SQLベースのWebアプリケーションでのキャッシングの使用

- 3.10.1 検証方式の使用

- 3.10.1.1 Last-Modified方法

- 3.10.1.2 Entity Tag方法

- 3.10.1.3 mod_plsqlでの検証方式の使用

- 3.10.1.4 検証方式を使用した2番目のリクエスト

- 3.10.2 期限方式の使用

- 3.10.3 PL/SQLベースのWebアプリケーションでのシステム・レベルおよびユーザー・レベルのキャッシング

- 3.11 mod_plsqlのパフォーマンス・チューニングの領域

- 3.11.1 mod_plsqlの接続プーリング

- 3.11.2 プールされたデータベース・セッションのクローズ

- 3.11.3 接続プールでの停止中のデータベース接続の検出

- 3.11.3.1 停止中のデータベース接続を検出するためのオプションの指定

- 3.11.3.2 タイムアウト期間の指定

- 3.12 mod_plsqlでの制限事項

4 PL/SQLのパフォーマンスの最適化

- 4.1 Oracle HTTP ServerでのPL/SQLのパフォーマンス - 概要

- 4.2 Oracle HTTP Serverでのプロセス・ベースおよびスレッド・ベースの操作

- 4.3 mod_plsqlでのパフォーマンス・チューニング問題

- 4.3.1 PL/SQLベースのWebアプリケーション開発における考慮事項とプログラミングのヒント

- 4.3.2 接続プーリングのヒントおよびOracle HTTP Server構成

- 4.3.3 データベース・セッションの数のチューニング

- 4.3.4 2リスナー方針

- 4.3.5 オーバーヘッドの問題

- 4.3.5.1 Describeのオーバーヘッド

- 4.3.5.2 Describeのオーバーヘッドの回避

- 4.3.6 柔軟なパラメータの受渡し(4パラメータ)のオーバーヘッド

- 4.4 キャッシングのパフォーマンスを向上させるためのファイル・システム・キャッシュのチューニング

- 4.4.1 ファイル・システム・キャッシュのチューニングの概要

- 4.4.2 ファイル・システム・キャッシュの有効化

- 4.4.3より高速なファイル・システムに存在するためのファイル・システム・キャッシュの構成

- 4.4.4 ファイル・システム・キャッシュのサイズ変更

- 4.4.4.1 PlsqlCacheTotalSizeによる合計キャッシュ・サイズの設定

- 4.4.4.2 PlsqlCacheMaxAgeによるキャッシュのエージング日数の設定

- 4.4.4.3 PlsqlCacheMaxSizeによるキャッシュ・ファイルの最大ファイル・サイズの設定

- 4.4.5 キャッシュ・クリーンアップの構成

- 4.5 Oracle HTTP Serverのディレクティブ

A よくある質問

索引

Oracle® Fusion Middleware

mod_plsqlユーザーズ・ガイド

11gリリース1(11.1.1)

B56249-03(原本部品番号:E12041-03)

2011年11月

Oracle Fusion Middleware mod_plsqlユーザーズ・ガイド, 11gリリース1(11.1.1)

B56249-03

Copyright © 1996, 2011, Oracle and/or its affiliates.All rights reserved.

原本主著者: Swati Thacker

原本協力者: Showvik Roy Chowdhuri、Peter Lubbers、Pushkar Kapasi、Eric Lee、Thomas Van Raalte、Nick Greenhalgh

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007).Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはX/Open Company, Ltd.によってライセンス提供された登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

はじめに

このマニュアルでは、mod_plsqlのインストール、設定およびメンテナンスの方法について説明します。

対象読者

このマニュアルは、mod_plsqlを使用してPL/SQLベースのデータベース・アプリケーションをWorld Wide Web上に配置するOracle Fusion Middleware管理者を対象としています。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/us/corporate/accessibility/index.htmlを参照してください。

Oracleサポートへのアクセス

Oracleカスタマは、My Oracle Supportから電子サポートにアクセスできます。詳細情報はhttp://www.oracle.com/support/contact.htmlか、聴覚に障害のあるお客様はhttp://www.oracle.com/accessibility/support.htmlを参照してください。

関連ドキュメント

詳細は、次のドキュメントを参照してください。

- 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』

- 『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』

- 『Oracle Fusion Middleware Administrator's Guide』

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 mod_plsqlの構成

この章では、mod_plsqlの設定および使用方法について説明します。ここの内容は、次のとおりです。

- 前提条件の確認

- 必須パッケージのインストール

- mod_plsqlをOracle Portalで使用するための構成

- PL/SQLアプリケーション用のDADの構成

- mod_plsqlの構成へのアクセス

- mod_plsqlの診断結果

1.1 前提条件の確認

mod_plsqlを実行する前に、次の前提条件を満たしている必要があります。

- mod_plsqlで必要なPL/SQL Web ToolkitパッケージをロードするデータベースのSYSユーザー・パスワードが必要です。

- mod_plsqlを接続するデータベースが稼働している必要があります。

- Oracle HTTP Server mod_plsqlは、OWAパッケージのバージョン10.1.2.0.9とともに出荷されます。

1.2 必須パッケージのインストール

インストール後に、Oracle HTTP Serve mod_plsqlを製品には含まれていないデータベースで使用する必要がある場合は、owaload.sqlスクリプトを使用して、追加の必須パッケージを手動でインストールする必要があります。

注意:
Exportユーティリティを使用して全データベースのエクスポートを実行した場合でも、OWALOAD.SQLスクリプトをSYSで実行して、新規のターゲット・インスタンスにmod_plsqlを再インストールする必要があります。インポート/エクスポート・メカニズムでは、SYS内のオブジェクトはインポートされないため、PL/SQLツールキットをSYSにインストールする必要があります。

1. owaload.sqlファイルが入っているディレクトリに移動します。このディレクトリはORACLE_HOME\ohs\mod_plsql\owaです。

2. SQL*Plusを使用して、SYSユーザーでOracle Databaseにログインします。
select owa_util.get_version from dual;

3. 次の問合せを実行して、現在インストールされているOWAパッケージのバージョンを確認できます。

- 問合せに成功しても、10.1.2.0.4より前のバージョンが表示される場合は、新しいバージョンのOWAパッケージをインストールすることをお薦めします。

- 問合せに失敗した場合は、OWAパッケージがインストールされていないか、かなり古いバージョンのOWAパッケージが実行されています。新しいOWAパッケージをインストールするか、新バージョンにアップグレードすることをお薦めします。

注意:
古いOWAパッケージの検出方法については、付録A「よくある質問」の「データベースに重複してインストールされているOWAパッケージを検出してクリーンアップするには、どうすればよいですか。」を参照してください。

4. SQLプロンプトで、次のコマンドを実行します。

@owaload.sql log_file

表1-1に、必須パッケージのインストール時のパラメータを示します。

表1-1 必須パッケージのインストール時のパラメータ

エレメント

説明

owaload.sql

PL/SQL Web ToolkitパッケージをSYSスキーマにインストールします。また、データベースの全ユーザーがアクセスできるよう、パブリック・シノニムを作成してパッケージをパブリックにします。これにより、データベースごとに必要なインストールは1回で済みます。

log_file

インストール・ログ・ファイルです。ログ・ファイルを作成するための書込み許可があることを確認してください。

5. ログ・ファイルを調べて、エラーがないことを確認します。

注意:
owaloadスクリプトは、データベース内にあるOWAパッケージの既存のリリースをチェックし、次の場合にのみ新しいバージョンをインストールします。

- OWAパッケージが存在しない場合。

- 古いバージョンのOWAパッケージが検出された場合。データベースに最新のOWAパッケージが存在する場合または新しいバージョンがインストールされている場合、owaloadスクリプトは何も処理を実行せず、その状況をログ・ファイルにレポートします。

6. 手動で再コンパイルします。

注意:
OWAパッケージをインストールすると、依存オブジェクトがすべて無効になることがあります。このパッケージは最初のアクセス時に自動的に再コンパイルされますが、再インストール後に手動で再コンパイルすることをお薦めします。

インストール後に、Select owa_util.get_version from dual;を実行して、OWAパッケージのバージョンをチェックします。表示されたバージョンが10.1.2.0.4以上であることを確認してください。

7. 次へのパブリック・アクセスが付与されたことに注意してください。

- OWA_CUSTOM

- OWA

- HTF

- HTP

- OWA_COOKIE

- OWA_IMAGE

- OWA_OPT_LOCK

- OWA_PATTERN

- OWA_SEC

- OWA_TEXT

- OWA_UTIL

- OWA_CACHE

- WPG_DOCLOAD

- OWA_MATCH

8. 次のパブリック・シノニムが作成されていることにも注意してください。

- OWA_CUSTOM用のOWA_CUSTOM

- OWA_CUSTOM用のOWA_GLOBAL

- OWA用のOWA

- HTF用のHTF

- HTP用のHTP

- OWA_COOKIE用のOWA_COOKIE

- OWA_IMAGE用のOWA_IMAGE

- OWA_OPT_LOCK用のOWA_OPT_LOCK

- OWA_PATTERN用のOWA_PATTERN

- OWA_SEC用のOWA_SEC

- OWA_TEXT用のOWA_TEXT

- OWA_UTIL用のOWA_UTIL

- OWA_CUSTOM用のOWA_INIT

- OWA_CACHE用のOWA_CACHE

- WPG_DOCLOAD用のWPG_DOCLOAD

- OWA_MATCH用のOWA_MATCH

1.3 mod_plsqlをOracle Portalで使用するための構成

Oracle Portalリポジトリに対してOracle Fusion Middleware中間層を実行するには、以下の手順を実行する必要があります。

1. Oracle Enterprise Managerを使用して、Oracle PortalリポジトリとOracle Application Server Single Sign-Onリポジトリのために、2つのPortalスタイルのDADを作成します。

2. 各DADの構成を編集し、PlsqlCompatibilityModeを1に設定します。DAD構成を編集するには、次の手順に従います。

1. ORACLE_INSTANCE\config\OHS\ohs1\mod_plsql\dads.confファイルを編集します。

2. Oracle PortalリポジトリとOracleAS Single Sign-On Serverリポジトリに接続するために使用するDADを探します。

3. DADに次の行を追加します。

PlsqlCompatibilityMode  1

4. 次のコマンドを実行してOracle HTTP Serverを再起動します。

ORACLE_INSTANCE\bin\opmnctl restartproc type=ohs

注意:
9.0.xとそれ以降のバージョンのOracle Portalリポジトリにアクセスするために使用するDADに対してPlsqlCompatibilityModeを設定すると、ドキュメント名にスペースまたはプラス(+)記号があり、Portalドキュメント表に掲載されているドキュメントをダウンロードすることができなくなります。こうしたドキュメントにアクセスするとエラーが発生し、「HTTP 404 - File not found」が表示されます。

警告:

バックエンドOracle Portalリポジトリを9.0.x以降のバージョンにアップグレードすると、DADからPlsqlCompatibilityModeフラグを削除する必要があります。詳細は、「DADからのPlsqlCompatibilityModeフラグの削除」を参照してください。

DADからのPlsqlCompatibilityModeフラグの削除

バックエンドOracle Portalリポジトリを9.0.x以降のバージョンにアップグレードした後、DADからPlsqlCompatibilityModeフラグを削除するには、次の手順を実行します。

1. ORACLE_INSTANCE\config\OHS\ohs1\mod_plsql\dads.confファイルを編集します。

2. バージョン9.0.x以降のOracle PortalリポジトリとOracle Application Single Sign-On Serverリポジトリに接続するために使用するDADを探します。

3. DADの次の行を削除します。

PlsqlCompatibilityMode  1

4. 次のコマンドを実行してOracle HTTP Serverを再起動します。

ORACLE_INSTANCE\bin\opmnctl restartproc type=ohs

1.4 PL/SQLアプリケーション用のDADの構成

Web対応のPL/SQLアプリケーションにアクセスするには、まず、mod_plsql用にPL/SQLデータベース・アクセス記述子(DAD)を構成します。DADは、mod_plsqlがデータベース・サーバーに接続してHTTPリクエストを実行する方法を指定する値のセットです。DADには、接続詳細の他、データベースでの各種操作およびmod_plsql全般にとって重要な構成パラメータが含まれています。mod_plsqlの構成パラメータの詳細は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』の「mod_plsql」を参照してください。

1.5 mod_plsqlの構成へのアクセス

mod_plsqlの構成方法は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』の「mod_plsql」を参照してください。

Fusion Middleware Controlを使用して、mod_plsqlを構成および監視することができます。mod_plsql構成にアクセスするには、Oracle HTTP Serverコンポーネントの「サーバーの詳細構成」ページを使用します。このページからDAD情報とキャッシュ設定を構成することができます。

mod_plsqlを監視および構成するには、次のファイルを使用します。

- cache.conf: 現在のキャッシュ構成を表示します。これらの設定を変更するには、ファイルを編集します。

- dads.conf: 既存のデータベース・アクセス記述子(DAD)の状態を表示します。このファイルを使用してDADを編集することもできます。『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』も参照してください。

Oracle Enterprise Manager 11g Fusion Middleware Controlを使用したmod_plsqlの構成

「mod_plsqlサービス」ページを表示する手順

1. Oracle Enterprise Manager 11g Fusion Middleware Controlにアクセスします。

2. Fusion Middleware Controlで、Oracle HTTP Serverとmod_plsqlがインストールされているOracle Fusion Middlewareのホームページに移動します。

3. システム・コンポーネント表の「HTTP_Server」をクリックして、Oracle HTTP Serverのホームページに移動します。

4. 「管理」をクリックし、「詳細構成」をクリックします。
「サーバーの詳細構成」ページが表示されます。「ファイルの選択」オプションからファイルを選択し、「実行」をクリックします。

1.6 mod_plsqlの診断結果

mod_plsqlは、HTTPを介してPL/SQLアプリケーションを起動することのできるOracle HTTP Serverモジュールです。Oracle HTTP Serverモジュールであるため、mod_plsqlのロギングはOracle HTTP Serverを介して行われます。

ロギングは、構成ファイルhttpd.confのLogLevelパラメータで制御されます。詳細は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』を参照してください。

mod_plsqlログ・ファイルの内容

mod_plsqlの診断情報の場所は、httpd.confファイルのOracle HTTP Serverパラメータによって決定されます。パラメータの一般的な値は次のとおりです。

"${ORACLE_INSTANCE}/diagnostics/logs/${COMPONENT_TYPE}/${COMPONENT_NAME}/error_log"

Oracle HTTP Serverエラー・ログには、次の2つのタイプのmod_plsqlメッセージが表示されます。

- 標準のmod_plsqlメッセージ

- パフォーマンスのmod_plsqlメッセージ

関連項目:
『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』

標準のmod_plsqlメッセージ

Oracle HTTP Serverエラー・ログに示される標準のmod_plsqlメッセージの例は、次のとおりです。

[Thu Jun 30 08:34:20 2005] [warn] mod_plsql: 'PlsqlCacheCleanupSize' is deprecated.

標準のmod_plsqlメッセージの内容は次のとおりです。

- 日付および時間: Thu June 30 08:34:20 2005

- メッセージ・レベル: warn

- このメッセージがmod_plsql由来であることを示す記述: mod_plsql

- メッセージ・テキスト: 'PlsqlCacheCleanupSize' is deprecated.

2 mod_plsqlを使用したアプリケーション・データベース・アクセスの保護

この章では、最適なセキュリティのためにデータベースとPL/SQLを設定する方法について説明します。内容は次のとおりです。

- セキュリティに関する考慮事項

- mod_plsqlを使用したユーザー認証

- ユーザーの認証解除

関連項目:
mod_plsqlの構成パラメータの詳細は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』を参照してください。

2.1 セキュリティに関する考慮事項

mod_plsqlは、データベース・アカウントが権限を有するプロシージャへのアクセスに使用できるPL/SQLゲートウェイです。これにはPUBLICに付与されているすべてのパッケージへのアクセス権も含まれているため、PL/SQLアプリケーション側で、権限のないパッケージまたはプロシージャへのアクセスにmod_plsqlが使用されないようにする必要があります。デフォルトでは、mod_plsqlがアクセスできない対象は次のとおりです。

- 重要なスキーマ。SYS.*など。

- 重要と認識されているが、PUBLICでアクセスできるパッケージ。OWA_*、DBMS_*およびUTL_*パッケージなど。

- URLに特殊文字を含むプロシージャ名。

mod_plsqlを使用して直接実行されないように、特定のパッケージへのアクセスを明示的に拒否するこのデフォルト・モデルは、適切に設計されたPL/SQLアプリケーションの大部分に対しては十分です。このレベルのセキュリティがPL/SQLアプリケーションには不十分である場合は、次の方法を1つ以上使用して、PL/SQLアプリケーションを確実に保護することをお薦めします。

- mod_plsqlでのPlsqlRequestValidationFunctionディレクティブの定義

- mod_plsqlでのPlsqlExclusionListディレクティブへのルールの追加

- カスタム認証でのAUTHORIZEプロシージャの使用

- データベース表の保護

- SQLインジェクションからのデータベースの保護

2.1.1 mod_plsqlでのPlsqlRequestValidationFunctionディレクティブの定義

mod_plsqlには、PlsqlRequestValidationFunctionというDADパラメータ・ディレクティブが用意されています。このディレクティブを使用すると、リクエストされたプロシージャのそれ以上の処理を許可または禁止できます。このディレクティブは、DADからの実行を禁止されたパッケージまたはプロシージャ・コールをブロックして、PL/SQLアプリケーションについて厳重なセキュリティを実装する場合に役立ちます。

このパラメータによって定義されるファンクションには、次のプロトタイプが必要です。

boolean function_name (procedure_name IN varchar2)

起動時には、引数procedure_nameに、リクエストで実行しようとしているプロシージャの名前が含まれます。

たとえば、ブラウザからコールできるすべてのPL/SQLアプリケーション・プロシージャがパッケージmypkg内にある場合、このファンクションの実装は例2-1に示すような単純なものになります。

例2-1 プロシージャをブロックするリクエスト検証ファンクションの実装

boolean my_validation_check (procedure_name varchar2)
is
begin
if (upper(procedure_name) like upper('myschema.mypkg%')) then
return TRUE;
else
return FALSE;
end if;
end;

ヒント:

- アプリケーションに属し、ブラウザからコールできるリクエストのみを許可するように、このファンクションを実装することをお薦めします。

- このファンクションは、すべてのリクエストについてコールされるため、必ずこのファンクションのパフォーマンスを高くしてください。次のような推奨事項があります。

- Webからアクセスできるすべてのプロシージャが既知のパッケージの小さなセットに属すように、また、これらのパッケージがWebブラウザから直接アクセスできないプロシージャを定義しないように、PL/SQLパッケージに名前を付けます。正しいネーミング規則を使用した検証ファンクションの実装は例2-1のようになります。

- 実装で表検索を実行し、実行が許可されるパッケージまたはプロシージャを特定する場合、共有プールにカーソルを留めると、パフォーマンスがさらに改善されることがあります。

2.1.2 mod_plsqlでのPlsqlExclusionListディレクティブへのルールの追加

mod_plsqlには、PlsqlExclusionListというDAD設定パラメータが用意されています。このパラメータを使用すると、特定のパターンを持つプロシージャをブラウザURLから直接実行することを禁止できます。指定されるパターンには大/小文字の区別はなく、任意の文字の組合せが0回以上発生することを示すワイルドカード・パターンの「*」を使用できます。ダイレクトURLからアクセスできないデフォルトのパターンは、sys.*、dbms_*、utl_*、owa_util.*、owa_*、ctxsys.*、mdsys.*、htp.*およびhtf.*です。Oracle Application Server 10gリリース2 (10.1.2)からは、ユーザーがPlsqlExclusionListを使用して追加ルールを構成していても、デフォルトの組込み除外リストは引き続き有効です。以前のバージョンでは、PlsqlExclusionListディレクティブがDAD設定でオーバーライドされると、デフォルト設定は適用されませんでした。

mod_plsqlでは、このディレクティブで指定したパターンの他に、タブ、改行、一重引用符(')、バックスラッシュ(\)などの特殊文字を含むURLも却下されます。

このディレクティブは、1つ以上の除外されたパッケージに作成された可能性があるデータベース・シノニムからの保護を提供しません。シノニムが存在し、脆弱である場合は、そのシノニムを除外されるパターンのリストに明示的に追加する必要があります。

PlsqlExclusionListパラメータの詳細は、 『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』の「mod_plsql」を参照してください。

注意:
PlsqlExclusionListディレクティブを#NONE#に設定すると、すべての保護が無効になるため、アクティブなWebサイトには使用しないでください。

dads.confというmod_plsqlの構成ファイルに、PlsqlExclusionListディレクティブを設定できます。この設定ファイルは、次のディレクトリにあります。

- (UNIX)ORACLE_INSTANCE/config/OHS/ohs1/mod_plsql

- (Windows)ORACLE_INSTANCE\config\OHS\ohs1\mod_plsql

ORACLE_INSTANCEは、Oracle HTTP Serverをインストールした場所です。

PUBLICに付与されるユーザー定義のPL/SQLプロシージャに対して最適なセキュリティを確保するには、例2-2に示すように、PlsqlExclusionListディレクティブを使用してユーザー設定をdads.confファイルに指定します。詳細は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』を参照してください。

例2-2 PlsqlExclusionListディレクティブの指定

PlsqlExclusionList myschema.mypackage*

2.1.3 カスタム認証でのAUTHORIZEプロシージャの使用

カスタム認証を使用するアプリケーションでは、AUTHORIZEプロシージャの実装で制限付きパッケージまたはプロシージャへのアクセスを拒否できます。

2.1.4 データベース表の保護

アプリケーション・オブジェクト(表およびプロシージャ)を含むスキーマを、mod_plsqlの実行対象であるスキーマと区別することが役に立つ場合があります。このようにすると、mod_plsqlがユーザーとして接続するとき、そのユーザーに付与されたAPI以外を経由して、表およびその他のデータベース・オブジェクトに直接アクセスすることを禁止できます。シノニムを使用すると、スキーマ接頭辞を付けなくてもプロシージャは実行可能になります。

2.1.5 SQLインジェクションからのデータベースの保護

SQLインジェクション攻撃は、悪質なユーザーがバックエンド・データベースに対して実行されているSQLコマンドを変更できる場合に発生します。変更内容には、追加のデータを読み取ること、失敗するはずの妥当性チェックを成功させること、レコードを書き込むこと、またはその他の方法でアプリケーションの円滑な実行に影響を与えることなどがあります。

多くのアプリケーションがデータベース上に構築されており、通常、ユーザー入力がデータベース問合せの一部として使用されています。アプリケーションのコーディングが慎重に行われていない場合、入力内容を注意深く構成することで、データベースに送信される問合せを変更できることがあります。

このようなSQLインジェクション攻撃を回避するには、ユーザーの入力によって作成される動的SQLを可能なかぎり使用しないようにします。

動的SQLにユーザー入力を使用する必要がある場合には、動的SQLで使用する前に、アプリケーション側で入力内容を適切にフィルタ処理する必要があります。たとえば、ユーザーが入力パラメータとして表の名前を入力する場合、基礎となるアプリケーション・コードで、このパラメータに使用できる値が有効な表の名前のみとなるようにする必要があります。

2.2 mod_plsqlを使用したユーザー認証

mod_plsqlでは、Oracle HTTP Serverから提供される認証レベルに加えて、様々な認証レベルを提供します。Oracle HTTP Serverはドキュメントや仮想パスなどを保護しますが、mod_plsqlはデータベースにログインしたり、PL/SQL Webアプリケーションを実行するユーザーを保護します。

表2-1に示すように、様々な認証モードを有効化できます。

表2-1 mod_plsqlで使用する認証モード

認証モード

アプローチ

Basic

HTTPのBasic認証を使用して認証が実行されます。ほとんどのアプリケーションでは、Basic認証が使用されます。

グローバルOWA

認証は、PL/SQL Web Toolkitパッケージを含むスキーマのowa_custom.authorizeプロシージャを使用して実行されます。

カスタムOWA

認証は、ユーザーのスキーマ(owa_customize.authorize)にあるパッケージとプロシージャを使用して実行されます。それが見つからない場合は、PL/SQL Web Toolkitパッケージを含むスキーマのパッケージとプロシージャが使用されます。

パッケージ別

認証は、ユーザーのスキーマ(packageName.authorize)にあるパッケージとプロシージャを使用して実行されます。

シングル・サインオン

認証は、Oracle Application Server Single Sign-Onを使用して実行されます。このモードを使用するのは、アプリケーションがOracleAS Single Sign-On Serverで動作する場合のみです。

2.2.1 Basic(データベース制御認証)

モジュールmod_plsqlは、データベース・レベルでの認証をサポートしています。HTTP Basic認証が使用されますが、この方式を使用してデータベースへのログオンを試行することで資格証明が認証されます。認証は、次のどちらかのユーザー名とパスワードを使用して、ユーザーのデータベース・アカウントと比較検証されます。

- DADに格納されているユーザー名とパスワード。エンド・ユーザーがログインする必要はありません。この方法は、公開情報を提供するWebページに便利です。

- ユーザーがブラウザのHTTP Basic認証ダイアログ・ボックスを使用して入力するユーザー名とパスワード。ユーザーは、このダイアログ・ボックスにユーザー名とパスワードを入力する必要があります。

2.2.2 Oracle HTTP Server mod_plsqlのBasic認証モード

Oracle HTTP Serverでは、Basic認証モードの仕組みが異なります。ユーザー名およびパスワードはDADに格納する必要があります。Oracle HTTP Serverでは、ファイル・システム上のパスワード・ファイルに資格証明が格納されている、HTTP Basic認証を使用します。認証は、そのファイルに指定されているユーザーと比較検証されます。

Basic認証モード

mod_plsqlは、Basic認証をサポートしています。Oracle HTTP Serverでは、ユーザーの資格証明をファイル・システム上のパスワード・ファイルと照合して認証します。この機能は、mod_authというモジュールによって提供されます。

2.2.3 グローバルOWA、カスタムOWAおよびパッケージ別(カスタム認証)

カスタム認証を使用すると、データベース・レベルではなくアプリケーション自体でユーザーを認証できます。認証は、ユーザー記述の認証ファンクションをコールすることで実行されます。

カスタム認証は、OWA_CUSTOMを使用して行われ、動的ユーザー名/パスワード認証とは組み合せることができません。カスタム認証には、DAD設定ファイルに格納されている静的ユーザー名/パスワードが必要です。mod_plsqlは、このDADユーザー名/パスワードを使用してデータベースにログインします。mod_plsqlはログインすると、アプリケーション・レベルのPL/SQLフックをコールして、認証コントロールをアプリケーションに戻します。このコールバック・ファンクションは、アプリケーション開発者によって実装されます。コールバック・ファンクションの戻り値により、認証の成功または失敗が決まります。値TRUEは成功を意味し、FALSEは失敗を意味します。

必要なカスタム認証の種類に応じて、認証ファンクションは様々な場所に配置できます。

- グローバルOWAの場合は、すべてのユーザーおよびプロシージャに対して同じ認証ファンクションをコールできます。

- カスタムOWAの場合は、各ユーザーおよびすべてのプロシージャに対して異なる認証ファンクションをコールできます。

- パッケージ別認証を使用すると、特定のパッケージのプロシージャまたは匿名プロシージャについてのみ、すべてのユーザーに対して認証ファンクションを実行できます。

たとえば、カスタムOWAを使用している場合、認証ファンクションは、ユーザーがパスワードwelcomeのユーザーguestとしてログインしているかどうかを確認できます。また、ユーザーのIPアドレスをチェックしてアクセス権を判別できます。

表2-2にパラメータ値を示します。

表2-2 カスタム認証モードとコールバック・ファンクション

モード

アクセス制御の有効範囲

コールバック・ファンクション

グローバルOWA

すべてのパッケージ

OWAパッケージ・スキーマ内のowa_custom.authorize。

カスタムOWA

すべてのパッケージ

ユーザーのスキーマ内、または見つからない場合はOWAパッケージ・スキーマ内のowa_custom.authorize。

パッケージ別

指定したパッケージ

ユーザーのスキーマ内のpackageName.authorize。またはanonymous.authorizeがコールされます。

2.3 ユーザーの認証解除

動的認証(DADにユーザー名とパスワードなし)を使用するDADの場合、mod_plsqlではPL/SQLプロシージャを介してユーザーをプログラム的にログオフ(HTTP認証情報を消去)させることができ、すべてのブラウザ・インスタンスを終了する必要はありません。この機能は、Netscape 3.0以上およびMicrosoft Internet Explorerでサポートされます。他のブラウザの場合、ユーザーが認証を解除するにはブラウザの終了操作が必要になることがあります。

ログアウトをシミュレートしてユーザーをサインオフ・ページにリダイレクトする独自のログアウト・プロシージャを作成すると、認証解除をプログラム的に実行できます。

MyLogOffProcプロシージャを次のように作成または置き換えます。

BEGIN
-- Open the HTTP header
owa_util.mime_header('text/html', FALSE, NULL);

-- Send a cookie to logout
owa_cookie.send('WDB_GATEWAY_LOGOUT', 'YES', path=>'/');

-- Close the HTTP header
owa_util.http_header_close;

-- Generate the page
htp.p('You have been logged off from the WEBSITE');
htp.anchor( 'http://www.abc.com', 'click here');
htp.p('<BR>bye');
END;

もう1つの認証解除方法は、URLのDADの後に/logmeoffを追加することです。たとえば、次のようになります。

http://www.abc.com:2000/pls/myDAD/logmeoff

3 mod_plsqlの概要

mod_plsqlは、Web上でのPL/SQLベースのデータベース・アプリケーションの配置をサポートします。mod_plsqlはOracle HTTP Serverの一部であり、Oracle Fusion MiddlewareおよびOracle Databaseに付属しています。Oracle HTTP Serverの一部として、WebブラウザからWebサーバーに送信されたURLを解析し、適切なPL/SQLサブプログラムをコールしてブラウザ・リクエストを処理した後、生成されたレスポンスをブラウザに返すことがmod_plsqlの役割です。通常、mod_plsqlは表示するHTMLページを構成することで、WebブラウザのHTTPリクエストにレスポンスを返します。mod_plsqlの用途は他にもありますが、その中の2つを次に示します。

- クライアント・マシンおよびOracle Database間でのファイルの送信。テキスト・ファイルまたはバイナリ・ファイルをアップロードおよびダウンロードできます。

- Webアプリケーションでのカスタム・ユーザーの認証の実行。

Oracle HTTP Serverへのプラグインとして、mod_plsqlは、HTTPリクエストへのレスポンスでストアド・プロシージャが実行されるようにします。mod_plsqlは、処理されるURLごとに、接続プールのデータベース・セッションを使用するか、または新規セッションを実行中に作成してプールします。mod_plsqlが適切なデータベースPL/SQLプロシージャをURL処理セッションで起動するには、まず、仮想パスを設定し、そのパスとデータベース・アクセス記述子(DAD)を関連付ける必要があります。

DADは、名前付きの設定値のセットで、特定のデータベースのセッションを作成するために必要な情報と、特定のデータベース・ユーザーおよびパスワードを指定します。セッションのデータベース・サービス名およびグローバリゼーション・サポート設定(言語など)が含まれます。詳細は、3.2項「データベース・アクセス記述子(DAD)」を参照してください。

実行時にmod_plsqlによって実行されるストアド・プロシージャを開発するには、PL/SQL Web Toolkitを使用します。PL/SQL Web Toolkitは一連のPL/SQLパッケージで、これを使用すると、HTTPリクエストに関する情報の取得、HTTPレスポンス・ヘッダー(HTTPヘッダーのCookie、コンテンツ・タイプ、MIMEタイプなど)の指定、Cookieの設定、およびHTMLページを作成するための標準HTMLタグの生成が可能です。詳細は、『Oracle Fusion Middleware PL/SQL Web Toolkitリファレンス』を参照してください。

この章の内容は、次のとおりです。

- クライアント・リクエストの処理

- データベース・アクセス記述子(DAD)

- mod_plsqlの実行

- トランザクション・モード

- サポートされるデータ型

- パラメータの受渡し

- ファイルのアップロードとダウンロード

- パスのエイリアシング(ダイレクト・アクセスURL)

- Common Gateway Interface(CGI)環境変数

- PL/SQLベースのWebアプリケーションでのキャッシングの使用

- mod_plsqlのパフォーマンス・チューニングの領域

- mod_plsqlでの制限事項

3.1 クライアント・リクエストの処理

mod_plsqlは、データベースと通信を行うOracle HTTP Serverのプラグインです。これによって、ブラウザ・リクエストが、SQL*Net接続を通じてデータベース・ストアド・プロシージャ・コールにマッピングされます。通常、仮想パスの/plsで示されます。

次に、サーバーがクライアント・リクエストを受信するときのステップの概要(図3-1)を説明します。

図3-1 サーバーがクライアント・リクエストを受信する際の処理の概要

「図3-1 サーバーがクライアント・リクエストを受信する際の処理の概要」の説明

1. Oracle HTTP Serverが、mod_plsqlで処理されるように構成されている仮想パスを含むリクエストを受信します。

2. Oracle HTTP Serverは、そのリクエストをmod_plsqlにルーティングします。

3. mod_plsqlは、DADに格納された設定情報を使用して、データベースに接続します。mod_plsqlは、リクエストをOracle Databaseに転送します。

4. mod_plsqlは、コール・パラメータを準備して、アプリケーション内のPL/SQLプロシージャを実行します。

5. PL/SQLプロシージャは、データベースからアクセスしたデータおよびPL/SQL Web Toolkitを使用して、HTMLページを生成します。

6. レスポンスがmod_plsqlに返されます。

7. Oracle HTTP Serverは、そのレスポンスをクライアント・ブラウザに送信します。

mod_plsqlから実行されたプロシージャは、HTTPレスポンスをクライアントに返します。この作業を簡単にするために、mod_plsqlにはPL/SQL Web Toolkitが含まれています。PL/SQL Web Toolkitには、OWAパッケージと呼ばれるパッケージのセットが含まれています。これらのパッケージをストアド・プロシージャ内で使用して、リクエスト情報の取得、HTMLタグの作成およびクライアントへのヘッダー情報の返信を行います。すべてのユーザーがアクセスできるように、このツールキットは共通スキーマにインストールしてください。

3.2 データベース・アクセス記述子(DAD)

各mod_plsqlリクエストは、データベース・アクセス記述子(DAD)に関連付けられています。DADは、データベース・アクセスに使用される設定値のセットです。DADでは次のような情報を指定します。

- データベース別名(Oracle Netサービス名)

- データベースがリモートの場合、その接続文字列

- ドキュメントのアップロードおよびダウンロード用のプロシージャ

また、DADにはユーザー名とパスワードの情報を指定できます。指定がない場合には、URLの実行時にユーザー名とパスワードを入力するプロンプトが表示されます。

関連項目:
DADパラメータの説明とmod_plsql構成ファイルの概要は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』を参照してください。

3.3 mod_plsqlの実行

mod_plsqlをWebブラウザで実行するには、次の形式でURLを入力します。

protocol://hostname[:port]/DAD_location/[[!][schema.][package.]proc_name[?query_string]]

表3-1に、mod_plsql実行時のパラメータを示します。

表3-1 mod_plsql実行時のパラメータ

パラメータ

説明

protocol

httpまたはhttpsのいずれか。SSLの場合は、httpsを使用します。

hostname

Webサーバーが稼働しているマシン。

port

(オプション)

Webサーバーがリスニングしているポート。指定しない場合、ポート80が使用されます。

DAD location

Webサーバーで設定したPL/SQLリクエストを処理するための仮想パス。DAD locationに使用できるのはASCII文字のみです。

!文字

(オプション)

柔軟なパラメータの受渡しスキームを使用することを示します。詳細は、3.6.2項「柔軟なパラメータの受渡し」を参照してください。

schema

(オプション)

データベース・スキーマ名。指定しない場合、package.proc_nameの名前解決は、URLリクエストを処理したデータベース・ユーザーに基づいて行われます。

package

(オプション)

PL/SQLストアド・プロシージャを含んだパッケージ。指定しない場合、プロシージャはスタンドアロンになります。

proc_name

実行するPL/SQLストアド・プロシージャ。ファンクションではなく、プロシージャを指定する必要があります。IN引数のみ使用可能です。

?query_string

(オプション)

ストアド・プロシージャのパラメータ。この文字列は、GETメソッドの書式に従います。たとえば、次のようになります。

- 複数のパラメータはアンパサンド(&)で区切ります。渡される値内の空白文字はプラス(+)に置き換えられます。

- HTMLフォームを使用して文字列を生成する場合(文字列を自分で生成するのではなく)、書式化は自動的に行われます。

- HTTPリクエストがHTTPのPOSTメソッドを使用してデータをmod_plsqlに送信する場合もあります。詳細は、「POSTメソッド、GETメソッドおよびHEADメソッド」を参照してください。

例3-1、例3-2および例3-3で、各種プロシージャがどのように実行されるかを説明します。

例3-1 引数をとらないプロシージャの実行

http://www.acme.com:9000/pls/mydad/mypackage.myproc

この場合、www.acme.comで稼働し、ポート9000でリスニングしているWebサーバーがリクエストを処理します。Webサーバーは、リクエストを受信すると、そのリクエストをmod_plsqlに渡します。これは、そのWebサーバーがmod_plsqlを実行するように設定されていることが、/pls/mydadにより示されるためです。次に、mod_plsqlは、/pls/mydadに関連付けられているDADを使用して、mypackageに格納されているmyprocプロシージャを実行します。

例3-2 引数をとるプロシージャの実行

http://www.acme.com:9000/pls/mydad/mypackage.myproc?a=v&b=1

この場合、www.acme.comで稼働し、ポート9000でリスニングしているWebサーバーがリクエストを処理します。Webサーバーは、リクエストを受信すると、/pls/mydadに関連付けられているDADを使用して、mypackageに格納されているmyprocプロシージャを実行し、2つの引数aおよびb(それぞれの値はvおよび1)をプロシージャに渡します。

例3-3 DAD設定に格納されているデフォルト・プロシージャの実行

http://www.acme.com:9000/pls/mydad

この場合、www.acme.comで稼働し、ポート9000でリスニングしているWebサーバーがリクエストを処理します。Webサーバーは、リクエストを受信すると、/pls/mydadに関連付けられているDADを使用して、DADに設定されているデフォルト・プロシージャを実行します。たとえば、DAD /pls/mydadの構成パラメータPlsqlDefaultPageがmyschema.mypackage.myprocに設定されている場合、プロシージャmyschema.mypackage.myprocがリクエストに対して実行されます。

この例では、DAD設定に指定されているmydadというDADのデフォルトのホームページが表示されます。

POSTメソッド、GETメソッドおよびHEADメソッド

HTTPプロトコルのPOSTメソッド、GETメソッドおよびHEADメソッドは、パラメータ・データをアプリケーションに渡す方法(通常は名前/値ペア形式)をブラウザに対して指示します。パラメータ・データはHTMLフォームによって生成されます。

mod_plsqlアプリケーションでは、いずれのメソッドも使用できます。各メソッドの保護レベルは、使用する転送プロトコル(HTTPまたはHTTPS)によって決定されます。

- POSTメソッドを使用する場合、パラメータはRequest Body内で渡されます。大量のパラメータ・データをサーバーに渡す場合は、通常、POSTメソッドを使用します。

- GETメソッドを使用する場合、パラメータは問合せ文字列を使用して渡されます。このメソッドには、使用するオペレーティング・システムにより、名前/値ペアの値の長さが環境変数の値の最大長を超えることができないという制限があります。さらに、オペレーティング・システムにより、定義できる環境変数の数も制限されます。

- HEADメソッドを使用する場合、GETメソッドと同じ機能を使用できます。違いは、HTTPステータス行およびHTTPヘッダーのみが返されることです。コンテンツ・データは、ブラウザに返信されません。このメソッドは、リクエストが正しく処理されているかどうかの確認のみを行うモニタリング・ツールで有効です。

- 複合モードでの使用: mod_plsqlでは、一部のパラメータを問合せ文字列で渡し、それ以外のパラメータをPOSTデータとして渡すことができます。たとえば、プロシージャfoo(a varchar2、b number)で、値vと1をそれぞれaとbに渡す場合は、次の3つの方法で値を渡してURLを作成できます。

- すべての値を問合せ文字列の一部として指定します。
http://host:port/pls/DAD/foo?a=v&b=1

- すべての値をPOSTデータの一部として指定します。
http://host:port/pls/DAD/foo, POST data="a=v&b=1"

- 一部のパラメータはURLで指定し、それ以外のパラメータはPOSTデータで指定します。
http://host:port/pls/DAD/foo?a=v, POST data="b=1"

注意:
POSTデータは、HTMLフォーム上の入力フィールドの一部として生成されます。PL/SQLプロシージャまたはURLに、POST文字列を手動で作成しないでください。HTMLフォームの送信操作により、POSTリクエストが生成され、プロシージャに値が渡されます。

3.4 トランザクション・モード

プロシージャを実行するためにURLリクエストを処理した後、エラーがあれば、mod_plsqlによりロールバックが実行されます。そうでない場合は、コミットが実行されます。このメカニズムでは、トランザクションが複数のHTTPリクエストにまたがることはできません。この状態を保持しないモデルの場合、アプリケーションは、通常HTTP Cookieまたはデータベース表を使用して状態を維持します。

3.5 サポートされるデータ型

HTTPでサポートされるのはキャラクタ・ストリームのみのため、mod_plsqlではPL/SQLデータ型の次のサブセットがサポートされます。

- NUMBER

- VARCHAR2

- TABLE OF NUMBER

- TABLE OF VARCHAR2

レコードはサポートされません。

3.6 パラメータの受渡し

mod_plsqlは、次の処理をサポートしています。

- 名前によるパラメータの受渡し
プロシージャまたはファンクションを起動するURL内の各パラメータは、一意の名前により識別されます。パラメータのオーバーロードがサポートされています。詳細は、3.6.1項「名前によるパラメータの受渡し(パラメータのオーバーロード)」を参照してください。

- 柔軟なパラメータの受渡し
プロシージャの先頭に感嘆符!が付加されます。詳細は、3.6.2項「柔軟なパラメータの受渡し」を参照してください。

- 大きなパラメータ(最大32KB)の受渡し
詳細は、3.6.3項「大きなパラメータの受渡し」を参照してください。

注意:
mod_plsqlでは、値をPL/SQL表に格納することで複数の値をとる変数が処理されます。これにより、ユーザーが選択できる値の数を柔軟に設定し、ユーザーによる選択を1単位として簡単に処理できます。それぞれの値は、PL/SQL表の1行に、索引1から順番に格納されます。複数の値をとる変数の最初の値(問合せ文字列に指定されている順)は索引1、同じ変数の2番目の値は索引2、などのように格納されます。mod_plsqlによって渡される引数の順序に、PL/SQLアプリケーションが依存しないようにしてください。引数の順序は突然変わることがあるためです。PL/SQL表の値の順序がプロシージャにとって大きな意味がある場合、PL/SQLアプリケーションを変更して、順序付けを内部的に実行する必要があります。
複数の値をとる変数がない場合、変数値はプロシージャのパラメータに位置ではなく名前で渡されるため、変数の順序は重要ではありません。

mod_plsql環境でパラメータとして使用するPL/SQL表は、ベース型をVARCHAR2とする必要があります。Oracleでは、VARCHAR2をNUMBER、DATEまたはLONGなどの他のデータ型に変換できます。VARCHAR2変数の最大長は32Kです。

PL/SQL表に対して1つ以上の値が送信されるという保証がない場合(ユーザーがオプションをまったく選択しなくてもよい場合など)は、HIDDENフォーム・エレメントを使用して最初の値を提供します。PL/SQL表に値を提供しないとエラーが生成されます。また、PL/SQL表にはデフォルト値を提供できません。

3.6.1 名前によるパラメータの受渡し(パラメータのオーバーロード)

オーバーロードにより、名前が同じでパラメータの数、順序またはデータ型のファミリが異なる複数のサブプログラム(プロシージャまたはファンクション)を使用できます。オーバーロードされたサブプログラムをコールすると、PL/SQLコンパイラは渡されたデータ型に基づいて、どのサブプログラムをコールするかを決定します。

PL/SQLでは、ローカル・サブプログラムとパッケージ・サブプログラムをオーバーロードできます。スタンドアロン・サブプログラムはオーバーロードできません。

パラメータ数が同じサブプログラムをオーバーロードする場合は、パラメータに違う名前を付ける必要があります。HTMLデータはデータ型に関連付けられないため、mod_plsqlは、どのバージョンのサブプログラムをコールすればよいか判断できません。

たとえば、PL/SQLでは、次の例に示すように、プロシージャに対して同じパラメータ名を使用して2つのプロシージャを定義できますが、これをmod_plsqlで使用するとエラーが発生します。

-- legal PL/SQL, but not for mod_plsql
CREATE PACKAGE my_pkg AS
PROCEDURE my_proc (val IN VARCHAR2);
PROCEDURE my_proc (val IN NUMBER);
END my_pkg;

エラーを回避するには、パラメータに異なる名前を付けます。たとえば、次のようになります。

-- legal PL/SQL and also works for mod_plsql
CREATE PACKAGE my_pkg AS
PROCEDURE my_proc (valvc2 IN VARCHAR2);
PROCEDURE my_proc (valnum IN NUMBER);
END my_pkg;

最初のバージョンのプロシージャを実行するURLは次のようになります。

http://www.acme.com:9000/pls/mydad/my_pkg.my_proc?valvc2=input

2番目のバージョンのプロシージャを実行するURLは次のようになります。

http://www.acme.com:9000/pls/mydad/my_pkg.my_proc?valnum=34

オーバーロードとPL/SQL配列

パラメータ名が同じで、1つのプロシージャのデータ型がowa_util.ident_arr(varchar2の表)、もう1つのプロシージャのデータ型がスカラー型のオーバーロードPL/SQLプロシージャがあるとします。このような場合でも、mod_plsqlはこの2つのプロシージャを区別できます。たとえば、次のプロシージャがあるとします。

CREATE PACKAGE my_pkg AS
PROCEDURE my_proc (val IN VARCHAR2); -- scalar data type
PROCEDURE my_proc (val IN owa_util.ident_arr); -- array data type
END my_pkg;

これらのプロシージャには、それぞれvalという同じ名前のパラメータが1つあります。

mod_plsqlは、valパラメータの値を1つだけ持つリクエストを受け取ると、例3-4に示すように、スカラー・データ型のプロシージャを実行します。

例3-4 URL送信によるスカラー・バージョンのプロシージャの実行

次のURLを送信して、スカラー・バージョンのプロシージャを実行します。

http://www.acme.com:9000/pls/mydad/my_proc?val=john

mod_plsqlは、valパラメータの値が複数存在するリクエストを受け取ると、例3-5に示すように、配列データ型のプロシージャを実行します。

例3-5 URL送信による配列バージョンのプロシージャの実行

次のURLを送信して、配列バージョンのプロシージャを実行します。

http://www.acme.com:9000/pls/mydad/my_proc?val=john&val=sally

確実に配列バージョンを実行できるようにする場合は、HTMLページでHIDDENフォーム・エレメントを使用してダミーの値を送信します。このダミーの値は、プロシージャ内でチェックされ、破棄されます。

3.6.2 柔軟なパラメータの受渡し

ユーザーがエレメントを必要な数だけ選択可能なHTMLフォームを使用できます。これらのエレメントにそれぞれ異なる名前が付いている場合は、オーバーロード・プロシージャを作成して可能な組合せを個別に処理する必要があります。または、問合せ文字列に含まれる名前が、ユーザーが選択するエレメントに関係なく確実に毎回一貫したものになるように、HIDDENフォーム・エレメントを挿入できます。mod_plsqlは、ユーザーが任意の数のエレメントを選択できるHTMLフォームを処理するために、柔軟なパラメータの受渡しをサポートすることで、この操作を容易にします。

URLベースのプロシージャの実行で柔軟なパラメータの受渡しを使用するには、URL内でプロシージャ名の先頭に感嘆符(!)を付加します。2パラメータまたは4パラメータを使用できます。2パラメータ・インタフェースによって、mod_plsqlのパフォーマンスが改善されます。4パラメータ・インタフェースは、互換性維持のためにサポートされています。

3.6.2.1 2パラメータ・インタフェース

procedure [proc_name]
(name_array IN [array_type],
value_array IN  [array_type]);

表3-2に、2パラメータ・インタフェースのパラメータを示します。

表3-2 2パラメータ・インタフェースのパラメータ

パラメータ

説明

proc_name

(必須)

実行するPL/SQLプロシージャの名前。

name_array

問合せ文字列から取り出される名前(1から順番に索引付けされる)を送信された順序で示します。

value_array

問合せ文字列から取り出される値(1から順番に索引付けされる)を送信された順序で示します。

array_type

(必須)

varchar2型(owa.vc_arrなど)の表による任意のPL/SQL索引。

例3-6に、2パラメータ・インタフェースの使用例を示します。

例3-6 2パラメータ・インタフェース

次のURLを送信します。

http://www.acme.com:9000/pls/mydad/!scott.my_proc?x=john&y=10&z=doe

感嘆符(!)接頭辞により、柔軟なパラメータの受渡しを使用することがmod_plsqlに指示されます。これにより、プロシージャscott.myprocが実行され、次の2つの引数が渡されます。

name_array ==> ('x', 'y', 'z')
value_array ==> ('john', '10', 'doe')

注意:
このスタイルの柔軟なパラメータの受渡しを使用する場合は、パラメータname_arrayおよびvalue_arrayを使用してプロシージャを定義する必要があります。これらの引数のデータ型は、例に示したデータ型と一致する必要があります。

3.6.2.2 4パラメータ・インタフェース

4パラメータ・インタフェースは、互換性維持のためにサポートされています。

procedure [proc_name]
(num_entires IN NUMBER,
name_array  IN  [array_type],
value_array IN  [array_type],
reserved in [array_type]);

表3-3に、4パラメータ・インタフェースのパラメータを示します。

表3-3 4パラメータ・インタフェースのパラメータ

パラメータ

説明

proc_name

(必須)

実行するPL/SQLプロシージャの名前。

num_entries

問合せ文字列内の名前/値ペアの数。

name_array

問合せ文字列から取り出される名前(1から順番に索引付けされる)を送信された順序で示します。

value_array

問合せ文字列から取り出される値(1から順番に索引付けされる)を送信された順序で示します。

reserved

未使用。これは、将来使用するために予約されています。

array_type

(必須)

varchar2型(owa.vc_arrなど)の表による任意のPL/SQL索引。

例3-7に、4パラメータ・インタフェースの使用例を示します。

例3-7 4パラメータ・インタフェース

query_stringで名前「x」が重複している次のURLを送信します。

http://www.acme.com:9000/pls/mydad/!scott.my_pkg.my_proc?x=a&y=b&x=c

感嘆符(!)接頭辞により、柔軟なパラメータの受渡しを使用することがmod_plsqlに指示されます。これにより、プロシージャscott.my_pkg.myprocが実行され、次の引数が渡されます。

num_entries ==> 3
name_array ==> ('x', 'y', 'x');
value_array ==> ('a', 'b', 'c')
reserved ==> ()

注意:
このスタイルの柔軟なパラメータの受渡しを使用する場合は、パラメータnum_entries、name_array、value_arrayおよびreservedを使用してプロシージャを定義する必要があります。これらの引数のデータ型は、例に示したデータ型と一致する必要があります。

3.6.3 大きなパラメータの受渡し

スカラー引数として渡される値と、varchar2引数の索引付き表の要素として渡される値に使用できるサイズは、最大32KBです。

たとえば、柔軟なパラメータの受渡し(3.6.2項「柔軟なパラメータの受渡し」を参照)を使用する場合、URLのquery_string部分の名前または値は、それぞれ実行されるプロシージャのname_arrayまたはvalue_array引数のエレメントとして渡されます。これらの名前または値に使用できるサイズは、最大32KBです。

3.7 ファイルのアップロードとダウンロード

mod_plsqlでは、次の機能を提供します。

- キャラクタ・セットを変換せずに、ファイルをロー・バイト・ストリームとしてアップロードおよびダウンロードすることができます。ファイルは、ドキュメント表にアップロードされます。PL/SQLアップロード・ハンドラ・ルーチンが適切な表の列を取得できるよう、主キーが渡されます。

- 異なるアプリケーションのアップロード対象ファイルを混同しないよう、DADごとにドキュメント表を1つ指定することができます。また、バイナリ・ラージ・オブジェクト(BLOB)のダイレクト・ダウンロード機能を使用すると、データベース表からコンテンツをダウンロードできます。

- 問合せ文字列を使用しない形式のURL経由でこれらの表のファイルにアクセスすることができます。たとえば、次のようになります。

http://www.acme.com:9000/pls/mydad/docs/cs250/lecture1.htm

これは、URLの相互参照を含んだファイル・セットのアップロードをサポートするために必要です。

- フォーム送信ごとに複数のファイルをアップロードすることができます。

- ドキュメント表のLONG RAWおよびBLOB型の列にファイルをアップロードすることができます。

この項の内容は、次のとおりです。

- ドキュメント表の定義

- 以前のスタイルのドキュメント表の定義

- ドキュメントのアップロード/ダウンロードの構成パラメータ

- ファイルのアップロード

- アップロード・ファイルの属性(MIMEタイプ)の指定

- 複数のファイルのアップロード

- ファイルのダウンロード

3.7.1 ドキュメント表の定義

DADごとにドキュメント格納表を指定できます。ドキュメント格納表には、次の定義が必要です。

CREATE TABLE [table_name] (
NAME           VARCHAR2(256) UNIQUE NOT NULL,
MIME_TYPE      VARCHAR2(128),
DOC_SIZE       NUMBER,
DAD_CHARSET    VARCHAR2(128),
LAST_UPDATED   DATE,
CONTENT_TYPE   VARCHAR2(128),
[content_column_name] [content_column_type]
[ , [content_column_name] [content_column_type]]
);

table_nameは、ユーザーが選択できます。content_column_type型には、LONG RAWまたはBLOBのいずれかを使用します。

content_column_nameは、対応するcontent_column_typeによって異なります。

- content_column_typeがLONG RAWの場合、content_column_nameはCONTENTにする必要があります。

- content_column_typeがBLOBの場合、content_column_nameはBLOB_CONTENTにする必要があります。

次に、有効なドキュメント表の定義例を示します。

CREATE TABLE MYDOCTABLE (
NAME               VARCHAR(256)   UNIQUE NOT NULL,
MIME_TYPE          VARCHAR(128),
DOC_SIZE           NUMBER,
DAD_CHARSET        VARCHAR(128),
LAST_UPDATED       DATE,
CONTENT_TYPE       VARCHAR(128),
CONTENT            LONG RAW,
BLOB_CONTENT       BLOB ;
);

3.7.1.1 CONTENT列のセマンティクス

表の内容は、CONTENT列に格納されます。ドキュメント表には、複数のCONTENT列を含めることが可能です。ただし、ドキュメント表の各行について、使用されるCONTENT列は1つのみです。その他のCONTENT列はNULLに設定されます。

3.7.1.2 CONTENT_TYPE列のセマンティクス

CONTENT_TYPE列は、ドキュメントが格納されているCONTENT列を追跡するために使用されます。ドキュメントがアップロードされると、mod_plsqlにより、この列の値が型名に設定されます。

たとえば、ドキュメントがBLOB_CONTENT列にアップロードされた場合、ドキュメントのCONTENT_TYPE列には文字列BLOBが設定されます。

3.7.1.3 LAST_UPDATED列のセマンティクス

LAST_UPDATED列には、ドキュメントの作成日時または最終更新日時が反映されます。ドキュメントがアップロードされると、mod_plsqlにより、ドキュメントのLAST_UPDATED列にデータベース・サーバーの時間が設定されます。

その後、アプリケーションがドキュメントの内容または属性を変更する場合、LAST_UPDATEDの時間も更新されるようにする必要があります。

mod_plsqlでは、LAST_UPDATED列を使用して、HTTPクライアント(ブラウザ)がドキュメントのキャッシュ済バージョンを使用できるかどうかをチェックし、HTTPクライアントに結果を知らせます。これにより、ネットワークの通信量が削減され、サーバーのパフォーマンスが改善されます。

3.7.1.4 DAD_CHARSET列のセマンティクス

DAD_CHARSET列は、ファイルのアップロード時のキャラクタ・セット設定を追跡します。この列は、今後使用するために予約されています。

3.7.2 以前のスタイルのドキュメント表の定義

WebDBリリース2.xより前のリリースで使用されているドキュメント・モデルとの下位互換性を維持するために、mod_plsqlでは、CONTENT_TYPE、DAD_CHARSETおよびLAST_UPDATED列が存在しない、以前のドキュメント格納表の定義もサポートしています。

/* older style document table definition (DEPRECATED) */
CREATE TABLE [table_name]
(
NAME         VARCHAR2(128),
MIME_TYPE    VARCHAR2(128),
DOC_SIZE     NUMBER,
CONTENT      LONG RAW

);

3.7.3 ドキュメントのアップロード/ダウンロードの構成パラメータ

DADの次の設定パラメータが、ドキュメントのアップロードまたはダウンロード操作に影響します。

- PlsqlDocumentTablename

- PlsqlDocumentPath(ドキュメント・アクセス・パス)

- PlsqlDocumentProcedure(ドキュメント・アクセス・プロシージャ)

- PlsqlUploadAsLongRaw

例3-8に、構成パラメータの使用例とその結果を示します。

例3-8 ドキュメントのアップロード/ダウンロードのパラメータ

DADでこれらのパラメータが次のように設定されているとします。

PlsqlDocumentTablename   scott.my_document_table
PlsqlUploadAsLongRaw   html
PlsqlDocumentPath   docs
PlsqlDocumentProcedure   scott.my_doc_download_procedure

この場合は次のようになります。

- mod_plsqlは、scottスキーマのmy_document_tableデータベース表からデータを取得するか、この表にデータを格納します。

- .htmlを除くすべてのファイル拡張子は、ドキュメント表にBLOBとしてアップロードされます。.html拡張子が付いたファイルはすべてLong Rawとしてアップロードされます。

- DAD locationの直後にdocsキーワードを含むすべてのURLでは、scott.my_doc_download_procedureプロシージャが実行されます。
通常、このプロシージャはwpg_docload.download_fileをコールして、URL指定に基づく名前を持ったファイルのダウンロードを開始します。

次に前述の構成の単純な例を示します。

http://www.acme.com:9000/pls/dad/docs/index.html

この場合は、scott.my_document_tableデータベース表のLong Raw列からindex.htmlファイルがダウンロードされます。アプリケーション・プロシージャは、開始するファイルのダウンロードを完全に制御し、ファイル・レベルのアクセス制御とバージョニングを実装する、より複雑なPlsqlDocumentProcedureを柔軟に定義します。

注意:
アプリケーション定義プロシージャscott.my_doc_download_procedureは引数なしで定義し、CGI環境変数に応じてリクエストを処理する必要があります。

3.7.3.1 PlsqlDocumentTablename

PlsqlDocumentTablenameパラメータは、このDADによってファイルがアップロードされたときにドキュメントを格納する表を指定します。

構文:

PlsqlDocumentTablename  [document_table_name]

PlsqlDocumentTablename  my_documents

または

PlsqlDocumentTablename  scott.my_document_table

3.7.3.2 PlsqlDocumentPath(ドキュメント・アクセス・パス)

PlsqlDocumentPathパラメータは、ドキュメントにアクセスするためのパス・エレメントを指定します。PlsqlDocumentPathパラメータは、URL内でDAD名の後に付加されます。たとえば、ドキュメント・アクセス・パスがdocsの場合、URLは次のようになります。

http://www.acme.com:9000/pls/mydad/docs/myfile.htm

mydadはDAD名で、myfile.htmはファイル名です。

構文:

PlsqlDocumentPath  [document_access_path_name]

3.7.3.3 PlsqlDocumentProcedure(ドキュメント・アクセス・プロシージャ)

PlsqlDocumentProcedureプロシージャは、アプリケーション指定のプロシージャです。このプロシージャはパラメータがなく、ドキュメント・アクセス・パスを持つURLリクエストを処理します。ドキュメント・アクセス・プロシージャは、ファイルをダウンロードするために、wpg_docload.download_file(filename)をコールします。ドキュメント・アクセス・プロシージャは、URL指定に基づいてファイル名を認識します。たとえば、アプリケーションでこれを使用して、ファイル・レベルのアクセス制御やバージョン管理を実装することが可能です。このようなアプリケーションの例は、3.7.7項「ファイルのダウンロード」にあります。

構文:

PlsqlDocumentProcedure  [document_access_procedure_name]

例3-9に、PlsqlDocumentProcedureプロシージャの使用例を示します。

例3-9 PlsqlDocumentProcedure

PlsqlDocumentProcedure  my_access_procedure

または

PlsqlDocumentProcedure  scott.my_pkg.my_access_procedure

3.7.3.4 PlsqlUploadAsLongRaw

DADパラメータPlsqlUploadAsLongRawは、ファイル拡張子に基づいてファイルのアップロードを設定します。PlsqlUploadAsLongRaw DADパラメータの値は、1行に1つのエントリがあるファイル拡張子のリストです。これらの拡張子を持つファイルは、mod_plsqlにより、ドキュメント表のLONG RAW型のCONTENT列にアップロードされます。他の拡張子を持つファイルは、BLOB CONTENT列にアップロードされます。

ファイル拡張子には、テキスト・リテラル(jpeg、gifなど)またはアスタリスク(*)を使用できます。アスタリスクは、PlsqlUploadAsLongRaw設定でリストされていない拡張子を持つすべてのファイルと一致します。

構文:

PlsqlUploadAsLongRaw  [file_extension]
PlsqlUploadAsLongRaw *

例3-10に示すように、[file_extension]はファイル拡張子(ピリオド(.)の有無は関係なく、たとえば、txtまたは.txtが使用できます)またはワイルド・カード文字(*)です。

例3-10に、PlsqlUploadAsLongRawプロシージャの使用例を示します。

例3-10 PlsqlUploadAsLongRaw

PlsqlUploadAsLongRaw  html
PlsqlUploadAsLongRaw  txt
PlsqlUploadAsLongRaw  *

3.7.4 ファイルのアップロード

クライアント・マシンからデータベースにファイルを送信する場合は、次に示す内容を含んだHTMLページを作成します。

- enctype属性にmultipart/form-dataが設定され、action属性に「アクション・プロシージャ」と呼ばれるmod_plsqlプロシージャ・コールが関連付けられているFORMタグ。

- type属性とname属性にfileが設定されたINPUTエレメント。INPUT type="file"エレメントを使用すると、ユーザーはファイル・システムのファイルを参照して、そこからファイルを選択できます。

ユーザーが「Submit」ボタンをクリックすると、次のイベントが発生します。

1. ブラウザは、ユーザーが指定したファイルとその他のフォーム・データをサーバーにアップロードします。

2. mod_plsqlは、ファイルの内容をデータベースのドキュメント格納表内に格納します。表の名前は、PlsqlDocumentTablename DAD設定から取得されます。

3. FORMのaction属性で指定したアクション・プロシージャが、ファイルのアップロードを行わずにmod_plsqlプロシージャを実行する場合と同じように実行されます。

注意:
HTMLドキュメントの解析は、mod_plsqlでは非推奨となりました。以前は、HTMLファイルのアップロード時にmod_plsqlを使用してその内容が解析され、HTMLドキュメントが参照している他のファイルが識別されていました。その後、この情報が表に格納されていました。表の名前は、ドキュメント表の名前にpartを追加したものが使用されていました。この機能は、カスタマにとって有用でないことが判明したため、リリース9.0.4のmod_plsqlから非推奨となりました。

次の例に、アップロードするファイルをユーザーがファイル・システムから選択できるHTMLフォームを示します。このフォームには、ファイルに関する情報を入力できるその他のフィールドも含まれています。

<html>
<head>
<title>test upload</title>
</head>
<body>
<FORM     enctype="multipart/form-data"
action="pls/mydad/write_info"
method="POST">
<p>Author's Name:<INPUT type="text" name="who">
<p>Description:<INPUT type="text" name="description"><br>
<p>File to upload:<INPUT type="file" name="filename"><br>
<p><INPUT type="submit">
</FORM>
</body>
</html>

ユーザーがフォームの「Submit」ボタンをクリックすると、次の処理が実行されます。

1. ブラウザにより、INPUT type="file"エレメントにリストされたファイルがアップロードされます。

2. 次に、write_infoプロシージャが実行されます。

3. このプロシージャは、フォームのフィールドの情報をデータベース内の表に書き込み、ページをユーザーに返します。

注意:
アクション・プロシージャでは、ユーザーにレスポンスを返す必要はありませんが、次に示すように、送信が成功したか失敗したかをユーザーに知らせるようにすることをお薦めします。

procedure write_info (
who         in varchar2,
description in varchar2,
filename        in varchar2) as
begin
insert into myTable values (who, description, filename);
htp.htmlopen;
htp.headopen;
htp.title('Filename Uploaded');
htp.headclose;
htp.bodyopen;
htp.header(1, 'Upload Status');
htp.print('Uploaded ' || filename || ' successfully');
htp.bodyclose;
htp.htmlclose;
end;

名前の競合の可能性を低減するために、ブラウザから取得したファイル名の先頭に、生成されたディレクトリ名が付加されます。フォームで指定されたアクション・プロシージャにより、この名前が変更されます。このため、たとえば/private/minutes.txtがアップロードされた場合、mod_plsqlによって表に格納される名前は、F9080/private/minutes.txtとなります。アプリケーションは、コールしたストアド・プロシージャの中で、この名前を変更できます。たとえば、アプリケーションにより、名前をscott/minutes.txtに変更できます。

関連項目:
RFC 1867『Form-Based File Upload in HTML』(IETF)

3.7.5 アップロード・ファイルの属性(MIMEタイプ)の指定

ストアド・プロシージャは、アップロード・ファイルの名前を変更する以外にも、他のファイル属性を変更できます。たとえば、3.7.4項「ファイルのアップロード」に示した例のフォームでは、アップロードされるドキュメントのMultipurpose Internet Mail Extension(MIME)タイプをユーザーが入力可能なフィールドとして表示できます。

MIMEタイプは、write_infoのパラメータとして受信できます。その場合、ドキュメント表には、ファイルのアップロード時にmod_plsqlがマルチパート・フォームから解析したデフォルトのMIMEタイプではなく、そのドキュメントのMIMEタイプが格納されます。

3.7.6 複数のファイルのアップロード

1回の送信で複数のファイルを送信する場合は、アップロード・フォームに適切な"name"属性がある複数の<INPUT type="file"エレメントが含まれている必要があります。複数のファイルのINPUTエレメントで、nameに同じ名前を定義する場合、アクション・プロシージャでパラメータ名をowa.vc_arr型として宣言する必要があります。ファイルのINPUTエレメントに一意の名前を定義することも可能で、その場合、アクション・プロシージャでそれぞれをvarchar2として宣言する必要があります。たとえば、フォームに次のエレメントが含まれているとします。

<INPUT type="file" name="textfiles">
<INPUT type="file" name="textfiles">
<INPUT type="file" name="binaryfile">

この場合、アクション・プロシージャに次のパラメータを含める必要があります。

procedure handle_text_and_binary_files(textfiles IN owa.vc_arr, binaryfile IN varchar2).

3.7.7 ファイルのダウンロード

ファイルをデータベースにアップロードした後、次に説明する3つの方法で、それらのファイルをデータベースからダウンロードできます。

- wpg_docload.download_file(file_name)をコールしてファイルfile_nameをダウンロードするPL/SQLプロシージャを定義します。

- ドキュメント・ダウンロード用の仮想パス(PlsqlDocumentPath)をDAD設定に定義し、ユーザー定義のプロシージャ(PlsqlDocumentProcedure)とそのパスを関連付けます。mod_plsqlは、DAD名のすぐ後ろにPlsqlDocumentPathで指定された仮想パスを検出すると、ユーザー定義のプロシージャ(PlsqlDocumentProcedure)を自動的に起動します。このプロシージャは、wpg_docload.download_file(file_name)をコールしてファイルfile_nameのダウンロードを開始する必要があります。追加の引数を渡さずに起動されるように、このユーザー定義のプロシージャにはプロトタイプが必要です。
たとえば、DADのmydadでPlsqlDocumentPathがdocsとして、PlsqlDocumentProcedureがmyschema.pkg.process_downloadとして構成されている場合、URLの形式がhttp://www.acme.com:9000/pls/mydad/docs/myfile.htmのときは常に、mod_plsqlはプロシージャmyschema.pkg.process_downloadを実行します。

次に、process_downloadの実装例を示します。

procedure process_download is
v_filename varchar2(255);
begin
-- getfilepath() uses the SCRIPT_NAME and PATH_INFO cgi
-- environment variables to construct the full path name of
-- the file URL, and then returns the part of the path name
-- following '/docs/'
v_filename := getfilepath;
select name into v_filename from plsql_gateway_doc
where UPPER(name) = UPPER(v_filename);
-- now we call docload.download_file to initiate
-- the download.
wpg_docload.download_file(v_filename);
exception
when others then
v_filename := null;
end process_download;

- バイナリ・ラージ・オブジェクト(BLOB)のダイレクト・ダウンロード・メカニズムを使用して、BLOBをデータベース表からダウンロードします。このためには、次に示すように、標準のHTTPヘッダー(MIMEタイプやコンテンツ長など)を返すPL/SQLプロシージャをコールし、wpg_docload.download_file(blob_name)を起動してBLOBのblob_nameをダウンロードします。

1. wpg_docload.download_file(blob)をコールするストアド・プロシージャを作成します。blobはBLOBデータ型です。mod_plsqlにはBLOBの内容に関する情報が含まれていないため、情報を入力する必要があります。

2. Content-Typeおよびその他のヘッダーを設定します。
次の例では、プロシージャは引数の名前を使用して表からBLOBを選択し、BLOBのダイレクト・ダウンロードを開始します。

create or replace procedure download_blob(name in varchar2) is
myblob blob;
begin

- name引数を使用して、mytableからBLOBを選択します。

select blob_data into myblob from mytable where blob_name = name;

- コンテンツを記述するヘッダーを設定します。

owa_util.mime_header('text/html', FALSE);
htp.p('Content-Length: ' || dbms_lob.getlength(myblob));
owa_util.http_header_close;

- BLOBのダイレクト・ダウンロードを開始します。

wpg_docload.download_file(myblob);
end;

mytable表の構造は、次のとおりです。

create table mytable
(
blob_name varchar2(128),
blob_data blob
);

ドキュメント・ダウンロードが開始されても、BLOBのダイレクト・ダウンロードが使用されない場合は、wpg_docload.download_fileに渡される引数により、ファイル名を一意に識別してドキュメント表からダウンロードできるようにする必要があります。このようなドキュメントの内容の返信時に、mod_plsqlは、そのファイル名に対するドキュメント表エントリの他の列に格納された情報に基づいて、HTTPレスポンス・ヘッダーを生成します。MIME_TYPE列、DOC_SIZE列およびLAST_UPDATED列はそれぞれ、レスポンス・ヘッダーのContent-Typeヘッダー、Content-LengthヘッダーおよびIf-Modified-Sinceヘッダーを追加するために使用されます。

注意:
wpg_docload.download_file APIをプロシージャからコールするたびに、ファイル・ダウンロード操作がmod_plsqlにより開始されます。このような操作では、プロシージャによって生成される他のHTMLコンテンツは、ブラウザには渡されません。

マルチバイト・キャラクタを使用するドキュメントのダウンロード

Windowsプラットフォームでmod_plsqlを使用しており、マルチバイト・キャラクタ・セット(日本語または韓国語)の一部として特殊文字0x5cを含むマルチバイト・データベースに対して実行している場合、ファイルdads.confを変更して、アプリケーションへのアクセスに使用されるDADを編集する必要があります。このためには、次の手順を実行します。

1. ORACLE_INSTANCE\config\OHS\ohs1\mod_plsql\dads.confファイルを開きます。

2. アプリケーションのアクセスに使用されるDADを探します。

3. WindowsFileConversion Offの行をこのDADエントリに追加します。

4. ファイルを保存します。

5. Oracle HTTP Serverを再起動します。

DAD設定を更新しないと、ファイル名に0x5cが含まれるドキュメントのダウンロード時に障害が発生します。たとえば、次のようになります。

- Oracle Portalで、次のダウンロード・エラーが示されます。

Error: Document not found (WWC-46000)

- ユーザー独自のPL/SQLアプリケーションに対してmod_plsqlを使用すると、ファイルのダウンロードで次のエラーが発生します。

HTTP-404 Not Found

3.8 パスのエイリアシング(ダイレクト・アクセスURL)

パスのエイリアシングにより、mod_plsqlを使用するアプリケーションは、単純なURLによるアプリケーション内のオブジェクトへの直接参照を提供できます。この機能は、ドキュメント・ダウンロード機能の提供方法を汎用化するものです。パスのエイリアシングには、DADの次の設定パラメータを使用します。

- PlsqlPathAlias

- PlsqlPathAliasProcedure

たとえば、DADでこれらのパラメータが次のように設定されているとします。

PlsqlPathAlias   myalias
PlsqlPathAliasProcedure   scott.my_path_alias_procedure

この場合、DAD locationの直後にmyaliasキーワードを含むすべてのURLで、scott.my_path_alias_procedureプロシージャが実行されます。このプロシージャは、URL指定に基づいて適切なレスポンスを開始できます。

注意:
アプリケーション定義プロシージャscott.my_path_alias_procedureは、varchar2型のp_pathという引数を1つとるように定義する必要があります。この引数は、PlsqlPathAliasに使用されているキーワードに続くすべてを受け取ります。
たとえば、前述の構成で次のURLがあるとします。

http://www.acme.com:9000/pls/dad/myalias/MyFolder/MyItem

このURLにより、scott.my_path_alias_procedureプロシージャはMyFolder/MyItem引数を受け取ります。

3.9 Common Gateway Interface(CGI)環境変数

OWA_UTILパッケージには、CGI環境変数の値を取得するためのAPIが付属しています。CGI環境変数の値は、mod_plsqlによって実行されるプロシージャにコンテキストを提供します。mod_plsqlはCGIによって処理されませんが、mod_plsqlから実行されるPL/SQLアプリケーションは、これらのCGI環境変数にアクセス可能です。

CGI環境変数のリストは次のとおりです。

- HTTP_AUTHORIZATION

- DAD_NAME

- DOC_ACCESS_PATH

- HTTP_ACCEPT

- HTTP_ACCEPT_CHARSET

- HTTP_ACCEPT_LANGUAGE

- HTTP_COOKIE

- HTTP_HOST

- HTTP_PRAGMA

- HTTP_REFERER

- HTTP_USER_AGENT

- PATH_ALIAS

- PATH_INFO

- HTTP_ORACLE_ECID

- DOCUMENT_TABLE

- REMOTE_ADDR

- REMOTE_HOST

- REMOTE_USER

- REQUEST_CHARSET(3.9.2.1項「REQUEST_CHARSET CGI環境変数」を参照)

- REQUEST_IANA_CHARSET(3.9.2.2項「REQUEST_IANA_CHARSET CGI環境変数」を参照)

- REQUEST_METHOD

- REQUEST_PROTOCOL

- SCRIPT_NAME

- SCRIPT_PREFIX

- SERVER_NAME

- SERVER_PORT

- SERVER_PROTOCOL

PL/SQLアプリケーションは、owa_util.get_cgi_envインタフェースを使用してCGI環境変数の値を取得できます。

構文:

owa_util.get_cgi_env(param_name in varchar2) return varchar2;

param_nameは、CGI環境変数の名前です。param_nameには大/小文字の区別があります。

3.9.1 CGI環境変数の追加およびオーバーライド

PlsqlCGIEnvironmentList DADパラメータは、1行に1つのエントリがある、名前/値ペアのリストです。任意の環境変数のオーバーライドや、新規の環境変数の追加ができます。名前が付属の環境変数(3.9項「Common Gateway Interface(CGI)環境変数」のリストを参照)の1つである場合、その環境変数は指定した値でオーバーライドされます。名前が付属の環境変数のリストにない場合は、パラメータで指定された名前および値と同じ新規の環境変数がリストに追加されます。

注意:
mod_plsqlの設定ファイルについては、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』を参照してください。

パラメータの値が指定されていない場合は、Oracle HTTP Serverから値が取得されます。Oracle HTTP Serverの場合は、次のように指定してCGI環境変数のDOCUMENT_ROOTを渡すことができます。

PlsqlCGIEnvironmentList DOCUMENT_ROOT

この設定パラメータから渡された新規の環境変数は、owa_util.get_cgi_envインタフェースを経由してPL/SQLアプリケーションで使用できます。

例3-11に、環境変数のオーバーライドが指定されたPlsqlCGIEnvironmentListの使用例を示します。

例3-11 環境変数のオーバーライドが指定されたPlsqlCGIEnvironmentList

PlsqlCGIEnvironmentList SERVER_NAME=myhost.mycompany.com
PlsqlCGIEnvironmentList REMOTE_USER=testuser

この例では、CGI環境変数のSERVER_NAMEとREMOTE_USERが付属の環境変数リストに含まれているため、これらの環境変数が指定の値にオーバーライドされます。

例3-12に、新規の環境変数が指定されたPlsqlCGIEnvironmentListの使用例を示します。

例3-12 新規の環境変数が指定されたPlsqlCGIEnvironmentList

PlsqlCGIEnvironmentList MYENV_VAR=testing
PlsqlCGIEnvironmentList SERVER_NAME=
PlsqlCGIEnvironmentList REMOTE_USER=user2

この例では、SERVER_NAME変数とREMOTE_USER変数がオーバーライドされます。SERVER_NAME変数は、値が指定されていないため、削除されます。MYENV_VARという新規の環境変数は、付属の環境変数のリストに含まれていないため追加されます。この環境変数には、「testing」という値が割り当てられます。

3.9.2 PlsqlNLSLanguage

mod_plsqlでは、PlsqlNLSLanguageのDADレベルの設定により、グローバリゼーション・サポート設定が制御されます。DADレベルでPlsqlNLSLanguageが設定されていない場合、グローバリゼーション・サポート設定にはOracleのNLS_LANGパラメータの環境設定が使用されます。このパラメータの詳細は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』の「mod_plsql」を参照してください。

3.9.2.1 REQUEST_CHARSET CGI環境変数

CGI環境変数REQUEST_CHARSETは、PlsqlNLSLanguageの設定に基づいて設定されます。DADレベルでPlsqlNLSLanguageが設定されていない場合、グローバリゼーション・サポート設定にはOracleのNLS_LANGパラメータの環境設定が使用されます。

PL/SQLアプリケーションは、ファンクション・コールによってこの情報にアクセスできます。たとえば、次のようになります。

owa_util.get_cgi_env('REQUEST_CHARSET');

3.9.2.2 REQUEST_IANA_CHARSET CGI環境変数

これは、CGI環境変数REQUEST_CHARSETに相当するIANA(Internet Assigned Number Authority)の環境変数です。IANAは、インターネット上のキャラクタ・セットの標準をグローバルに調整する機関です。

PL/SQLアプリケーションは、ファンクション・コールによってこの情報にアクセスできます。たとえば、次のようになります。

owa_util.get_cgi_env('REQUEST_IANA_CHARSET');

3.10 PL/SQLベースのWebアプリケーションでのキャッシングの使用

キャッシングを使用すると、PL/SQLベースのWebアプリケーションのパフォーマンスを向上させることができます。パフォーマンスを向上させるために、中間層のPL/SQLプロシージャによって生成されたWebコンテンツをキャッシュして、データベースのワークロードを減少させることができます。

この項では、次のようなキャッシングの方式について説明します。

- 検証方式の使用: アプリケーションは、ページが最後に提示されてから変更があったかどうかをサーバーに確認します。

- 期限方式の使用: PL/SQLベースのWebアプリケーションは、特定の時間間隔に基づいて、ページをキャッシュするか、または再度生成する必要があるかを決定します。

- PL/SQLベースのWebアプリケーションでのシステム・レベルおよびユーザー・レベルのキャッシング: 検証方式または期限方式を使用している場合に有効です。キャッシングのレベルは、ページが特定のユーザーに対してキャッシュされるのか、システム内のすべてのユーザーに対してキャッシュされるのかによって決まります。

これらの方式およびレベルは、PL/SQL Web Toolkitに含まれるowa_cacheパッケージを使用して実装されます。

関連項目:
『Oracle Fusion Middleware PL/SQL Web Toolkitリファレンス』

3.10.1 検証方式の使用

通常、検証方式では、ページが最後に提示されてから変更があったかどうかをサーバーに確認します。ページが変更されていない場合、キャッシュされたページがユーザーに提示されます。ページが変更されている場合、新しいコピーを取得してユーザーに提示した後、それをキャッシュします。

検証方式を使用する方法には、Last-Modified方法およびEntity Tag方法の2つがあります。次の2つの項では、これらの方式がHTTPプロトコルでどのように使用されるかを示します。PL/SQL GatewayではHTTPプロトコルを使用しませんが、多くの同じ原則が使用されます。

3.10.1.1 Last-Modified方法

WebページがHTTPプロトコルを使用して生成されると、そのページにはLast-Modifiedレスポンス・ヘッダーが含まれます。このヘッダーは、リクエストされたコンテンツの日付(サーバーを基準とする)を示しています。ブラウザは、この日付情報をコンテンツとともに保存します。後続のリクエストがWebページのURLに対して作成されると、ブラウザは次の処理を行います。

1. キャッシュされているバージョンがあるかどうかを確認します。

2. 日付情報を抽出します。

3. リクエスト・ヘッダーのIf-Modified-Sinceを生成します。

4. リクエストをサーバーに送信します。

キャッシュ対応のサーバーは、If-Modified-Sinceヘッダーを探し、それをコンテンツの日付と比較します。この2つが一致する場合は、「HTTP/1.1 304 Not Modified」などのHTTPレスポンス・ステータス・ヘッダーが生成され、コンテンツは返されません。このステータス・コードを受け取ると、キャッシュ・エントリは有効であるため、ブラウザはそれを再利用できます。

この2つが一致しない場合は、「HTTP/1.1 200 OK」などのHTTPレスポンス・ヘッダーが生成され、新しいコンテンツが、新しいLast-Modifiedレスポンス・ヘッダーとともに返されます。このステータス・コードを受け取ると、ブラウザはキャッシュ・エントリを新しいコンテンツおよび新しい日付情報で置き換える必要があります。

3.10.1.2 Entity Tag方法

HTTPプロトコルによって提供されるもう1つの検証方法は、ETag(Entity Tag)レスポンス/リクエスト・ヘッダーです。このヘッダーの値は、ブラウザに対して不明瞭な文字列です。サーバーは、この文字列をアプリケーションのタイプに基づいて生成します。この方法は、日付値のみを含めることができるIf-Modified-Sinceヘッダーよりも一般的な検証方法です。

ETag方法は、Last Modified方法とよく似ています。サーバーは、レスポンス・ヘッダーの一部としてETagを生成します。ブラウザは、この不明瞭なヘッダー値を返されたコンテンツとともに格納します。このコンテンツに対する次のリクエストを受信すると、ブラウザは、格納された不明瞭な値をIf-Matchヘッダーに設定してサーバーに渡します。サーバーがこの不明瞭な値を生成しているため、何をブラウザに返すかを判別できます。その他は、前述したLast-Modified検証方法とまったく同じです。

3.10.1.3 mod_plsqlでの検証方式の使用

HTTP検証キャッシングをフレームワークとして使用すると、mod_plsqlの検証モデルは次のようになります。

処理されるコンテンツを制御するPL/SQLベースのWebアプリケーションでは、この種のキャッシングを使用する必要があります。この方式を使用すると、適度にパフォーマンスが改善されます。たとえば、常に変わる動的コンテンツを処理するWebアプリケーションがこれに該当します。この場合、Webアプリケーションには、処理対象に対する完全な制御が必要です。検証キャッシングでは、キャッシュされたコンテンツが古いものか、またはブラウザに返された後のものであるかをWebアプリケーションに常に確認します。

図3-2は、mod_plsqlで検証方式が使用される仕組みを表したものです。

図3-2 検証方式

「図3-2 検証方式」の説明

1. Oracle HTTP Serverがクライアント・サーバーからPL/SQLプロシージャ・リクエストを受信します。Oracle HTTP Serverは、そのリクエストをmod_plsqlにルーティングします。

2. mod_plsqlはリクエストを準備します。

3. mod_plsqlはWebアプリケーションでPL/SQLプロシージャを起動し、通常のCommon Gateway Interface(CGI)環境変数をWebアプリケーションに渡します。

4. PL/SQLプロシージャは、返すためのコンテンツを生成します。PL/SQLプロシージャが生成されたコンテンツをキャッシュ可能であると判断した場合、PL/SQL Web Toolkitのowa_cacheプロシージャをコールし、タグおよびキャッシュ・レベルを設定します。

owa_cache.set_cache(p_etag, p_level);

表3-4に、検証モデルのパラメータを示します。

表3-4 検証モデルのパラメータ

パラメータ

説明

set_cacheプロシージャ

返されたコンテンツがキャッシュできることをmod_plsqlに通知するためのヘッダーを設定します。その後、コンテンツがブラウザに返される際に、mod_plsqlは、タグおよびキャッシング・レベル情報とともにコンテンツをローカル・ファイル・システムにキャッシュします。

p_etag

コンテンツをタグ付けするためにプロシージャが生成する文字列。

p_level

キャッシング・レベル: SYSTEM(システム・レベルの場合)またはUSER(ユーザー・レベルの場合)。

1. HTMLがmod_plsqlに返されます。

2. mod_plsqlは、次のリクエストのために、キャッシュ可能なコンテンツをファイル・システムに格納します。

3. Oracle HTTP Serverは、そのレスポンスをクライアント・ブラウザに送信します。

3.10.1.4 検証方式を使用した2番目のリクエスト

mod_plsqlの検証方式を使用し、クライアント・ブラウザによって、同じPL/SQLプロシージャに対する2番目のリクエストが作成されます。

図3-3に、検証方式を使用した2番目のリクエストを示します。

図3-3 検証方式 - 2番目のリクエスト

「図3-3 検証方式 - 2番目のリクエスト」の説明

1. mod_plsqlは、リクエストに対してキャッシュされたコンテンツがあることを検出します。

2. mod_plsqlは、(最初のリクエストからの)同じタグおよびキャッシング・レベル情報をCGI環境変数の一部としてPL/SQLプロシージャに転送します。

3. PL/SQLプロシージャは、これらのキャッシングCGI環境変数を使用して、コンテンツが変更されているかどうかを確認します。そのために、PL/SQL Web Toolkitの次のowa_cacheファンクションをコールします。

owa_cache.get_etag;
owa_cache.get_level;

これらのowaファンクションが、タグおよびキャッシング・レベルを取得します。

4. Webアプリケーションは、このキャッシング情報をmod_plsqlに送信します。

5. この情報に基づいて、コンテンツを再生成する必要があるか、またはキャッシュから取得できるかを判別します。

1. コンテンツが同じである場合は、プロシージャはowa_cache.set_not_modifiedプロシージャをコールし、コンテンツを生成しません。このため、mod_plsqlではキャッシュされたコンテンツを使用します。このキャッシュされたコンテンツは、ブラウザに直接返されます。

2. コンテンツに変更があった場合は、新規のタグおよびキャッシュ・レベルとともに新規コンテンツが生成されます。mod_plsqlでは、キャッシュ内の古いコピーが新規コピーで置換され、タグおよびキャッシュ・レベル情報が更新されます。新しく生成されたコンテンツが、ブラウザに返されます。

3.10.2 期限方式の使用

検証モデルでは、mod_plsqlは、キャッシュからコンテンツを提供できるかどうかを常にPL/SQLプロシージャに確認します。期限モデルでは、プロシージャはコンテンツの有効期間をあらかじめ設定します。そのため、mod_plsqlは、プロシージャに確認することなくキャッシュからコンテンツを提供できます。この方式では、データベースとのやり取りが必要ないため、パフォーマンスが一層向上します。

このキャッシング方式を使用すると、最高のパフォーマンスが得られます。PL/SQLベースのWebアプリケーションにおいて、古いコンテンツの提供が問題にならない場合に使用します。たとえば、ニュースを毎日生成するアプリケーションがこれに該当します。ニュースは24時間有効に設定できます。24時間以内であれば、アプリケーションとやり取りせずにキャッシュされたコンテンツが提供されます。これは、基本的にファイルの提供と同じです。24時間を経過すると、mod_plsqlは再度新しいコンテンツをアプリケーションから取得します。

検証モデルで説明したものと同じシナリオを考えてみます。ただし、プロシージャではキャッシングに期限モデルを使用します。

図3-4は、mod_plsqlで期限方式が使用される仕組みを表したものです。

図3-4 期限方式

「図3-4 期限方式」の説明

1. Oracle HTTP Serverがクライアント・サーバーからPL/SQL Server Pageリクエストを受信します。Oracle HTTP Serverは、そのリクエストをmod_plsqlにルーティングします。

2. mod_plsqlは、リクエストをOracle Databaseに転送します。

3. mod_plsqlはアプリケーションでPL/SQLプロシージャを起動し、通常のCommon Gateway Interface(CGI)環境変数をアプリケーションに渡します。

4. PL/SQLプロシージャは、返すためのコンテンツを生成します。PL/SQLプロシージャが生成されたコンテンツをキャッシュ可能であると判断した場合、PL/SQL Web Toolkitのowa_cacheプロシージャをコールし、有効期間およびキャッシュ・レベルを設定します。

owa_cache.set_expires(p_expires, p_level);

表3-5に、期限モデルのパラメータを示します。

表3-5 期限モデルのパラメータ

パラメータ

説明

set_expiresプロシージャ

期限キャッシングを使用していることをmod_plsqlに通知するためのヘッダーを設定します。その後、mod_plsqlは、有効期間およびキャッシング・レベル情報とともにコンテンツをファイル・システムにキャッシュします。

p_expires

コンテンツが有効な分数。

p_level

キャッシング・レベル。

1. HTMLがmod_plsqlに返されます。

2. mod_plsqlは、次のリクエストのために、キャッシュ可能なコンテンツをファイル・システムに格納します。

3. Oracle HTTP Serverは、そのレスポンスをクライアント・ブラウザに送信します。

期限方式を使用した2番目のリクエスト

前述の同じ期限モデルを使用し、クライアント・ブラウザによって、同じPL/SQLプロシージャに対する2番目のリクエストが作成されます。

図3-5に、期限方式を使用した2番目のリクエストを示します。

図3-5 期限方式 - 2番目のリクエスト

「図3-5 期限方式 - 2番目のリクエスト」の説明

1. mod_plsqlは、期限ベースの、キャッシュされたコンテンツのコピーがあることを検出します。

2. mod_plsqlは、現在の時刻とこのキャッシュ・ファイルが作成された時刻の差を取得してコンテンツの有効性を確認します。

1. この差が有効期間内にある場合は、キャッシュされたコピーはまだ新しいものであるため、データベースとやり取りせずに使用されます。このキャッシュされたコンテンツは、ブラウザに直接返されます。

2. この差が有効期間内にない場合は、キャッシュされたコピーは古くなっています。mod_plsqlは、PL/SQLプロシージャを起動して、新しいコンテンツを生成します。次に、プロシージャが期限ベースのキャッシングを再度使用するかどうかを決定します。使用する場合は、この新しいコンテンツの有効期間も決定します。新しく生成されたコンテンツが、ブラウザに返されます。

3.10.3 PL/SQLベースのWebアプリケーションでのシステム・レベルおよびユーザー・レベルのキャッシング

PL/SQLプロシージャは、生成されたコンテンツがシステム・レベルのコンテンツか、ユーザー・レベルのコンテンツかを判断します。これにより、複数のユーザーが同じコンテンツを参照している場合、PL/SQL Gatewayキャッシュによる重複ファイルの格納を減らすことができます。判断は、次の基準で行われます。

- システム・レベル・コンテンツの場合、プロシージャは、文字列SYSTEMをキャッシング・レベル・パラメータとしてowa_cacheファンクションに渡します(検証モデルの場合はset_cache、期限モデルの場合はset_expires)。これは、キャッシュを共有するすべてのユーザーに対して行われます。
システム・レベル・キャッシングを使用すると、ファイル・システムの領域とシステム内のすべてのユーザーに費やす時間の両方を節約できます。たとえば、そのWebアプリケーションを使用しているすべてのユーザーを対象としたコンテンツを生成するWebアプリケーションがこれに該当します。システム・レベル設定でコンテンツをキャッシングすると、コンテンツのコピーは1つのみファイル・システムにキャッシュされます。さらに、コンテンツはキャッシュからディレクトリに提供されるため、そのシステムのすべてのユーザーにメリットがあります。

- ユーザー・レベル・コンテンツの場合、プロシージャは、文字列USERをキャッシング・レベルのパラメータとして渡します。これは、ログインしている特定のユーザーに対して行われます。格納されるキャッシュはそのユーザー独自のものです。そのユーザーのみがキャッシュを使用できます。ユーザーのタイプは、認証モードによって決まります。様々なユーザーのタイプは、表3-6を参照してください。

表3-6 認証モードにより決定されるユーザーのタイプ

認証モード

ユーザーのタイプ

Single Sign-On(SSO)

軽量ユーザー

Basic

データベース・ユーザー

カスタム

リモート・ユーザー

たとえば、PL/SQLベースのWebアプリケーションをカスタマイズしているユーザーがいない場合、出力はシステム・レベル・キャッシュに格納できます。システムのすべてのユーザーに対してキャッシュ・コピーは1つしかありません。複数のユーザーがキャッシュを使用できるため、ユーザー情報は使用されません。

ただし、ユーザーがアプリケーションをカスタマイズしている場合、ユーザー・レベル・キャッシュはそのユーザーに対してのみ格納されます。他のユーザーはすべて、引き続きシステム・レベル・キャッシュを使用します。ユーザー・レベル・キャッシュ・ヒットにおいては、ユーザー情報が基準となります。ユーザー・レベル・キャッシュは、常にシステム・レベル・キャッシュをオーバーライドします。

関連項目:
認証モードの詳細は、2.2項「mod_plsqlを使用したユーザー認証」を参照してください。

PL/SQL Web Toolkitのファンクション(owa_cacheパッケージ)

検証方式または期限方式のどちらを使用するのかによって、コールするowa_cacheのファンクションが決まります。

owa_cacheパッケージには、特別なキャッシング・ヘッダーと環境変数を設定および取得するプロシージャが含まれます。開発者は、これらのプロシージャを使用すると、PL/SQL Gatewayキャッシュをより簡単に使用できます。このパッケージは、すでにデータベースにインストールされています。

表3-7に、コール対象の主要なファンクションを示します。

表3-7 主要なowa_cacheのファンクション

owaファンクション

目的

owa_cache.set_cache (p_etag IN varchar2, p_level IN varchar2)

検証モデル: ヘッダーを設定します。

- p_etagパラメータは、生成されたコンテンツをタグ付けします。

- p_levelパラメータは、使用するキャッシング・レベルを表します。

owa_cache.set_not_modified

検証モデル: キャッシュされたコンテンツを使用するようにmod_plsqlに通知するためのヘッダーを設定します。検証ベースのキャッシュ・ヒットが発生する場合のみ使用されます。

owa_cache.get_level

検証モデル: キャッシング・レベルのUSERまたはSYSTEMを取得します。キャッシュがヒットしない場合はNULLを返します。

owa_cache.get_etag

検証モデル: キャッシュされたコンテンツと関連付けられているタグを取得します。キャッシュがヒットしない場合はNULLを返します。

owa_cache.set_expires(p_expires IN number, p_level IN varchar2)

期限モデル: ヘッダーを設定します。

- p_expiresパラメータは、コンテンツが有効な分数を表します。

- p_levelパラメータは、使用するキャッシング・レベルを表します。

3.11 mod_plsqlのパフォーマンス・チューニングの領域

PL/SQLベースのWebアプリケーションのパフォーマンスを向上させるためにmod_plsqlをチューニングする場合、mod_plsqlの内部的な動作に精通していることが重要です。この項では、mod_plsqlのいくつかの機能について概要を説明します。

この項の内容は、次のとおりです。

- mod_plsqlの接続プーリング

- プールされたデータベース・セッションのクローズ

- 接続プールでの停止中のデータベース接続の検出

3.11.1 mod_plsqlの接続プーリング

UNIXプラットフォームでは、mod_plsqlでのデータベース・サーバー接続プーリングのロジックは、例をあげることで最もよく説明できます。次の一般的な例を考えてみます。

1. Oracle HTTP Serverリスナーが起動されます。mod_plsqlによって保持されている接続プールにデータベース接続はありません。

2. ブラウザが、データベース・アクセス記述子(DAD)D1に対してmod_plsqlリクエスト(R1)を作成します。

3. Oracle HTTP Serverプロセスの1つ(httpdプロセスP1)が、リクエストR1の処理を開始します。

4. プロセスP1のmod_plsqlが接続プールを確認し、このユーザー・リクエストに対するデータベース接続がプールにないことがわかります。

5. DAD D1の情報に基づいて、プロセスP1のmod_plsqlが、新しいデータベース接続をオープンし、PL/SQLリクエストを処理して、プールにそのデータベース接続を追加します。

6. この時点から、DAD D1のプロセスP1に対する後続のすべてのリクエストは、mod_plsqlによってプールされたデータベース接続を使用できます。

注意:
11g UNIXリリースでは、Oracle HTTP Serverはプロセスごとの複数のスレッドをサポートしています。複数の同時mod_plsqlリクエストが1つのOracle HTTP Serverプロセスで処理される場合、mod_plsqlは、必要に応じて同時mod_plsqlリクエストを処理するために追加のデータベース接続をオープンします。

7. DAD D1に対するリクエストが別のプロセス(プロセスP2)で取得された場合、プロセスP2のmod_plsqlは独自のデータベース接続をオープンし、リクエストを処理して、プールにそのデータベース接続を追加します。

8. この時点から、DAD D1のプロセスP2に対する後続のすべてのリクエストは、mod_plsqlによってプールされたデータベース接続を使用できます。

注意:
複数の同時mod_plsqlリクエストがプロセスP2で処理される場合、必要に応じて同時mod_plsqlデータベース・リクエストに対応するために、追加のデータベース接続がオープンされます。

9. ここで、リクエストR2がDAD D2に対して作成され、このリクエストがプロセスP1にルーティングされるとします。

10. プロセスP1のmod_plsqlには、DAD D2用にプールされたデータベース接続がないため、新しいデータベース・セッションがDAD D2用に作成され、リクエストを処理した後にプールされます。この時点で、プロセスP1には、2つのデータベース接続がプールされています。1つはDAD D1用、もう1つはDAD D2用です。
ステップ1から10に示されたこの例で、重要な詳細は次のとおりです。

1. 各Oracle HTTP Serverプロセスは、静的ファイル・リクエスト、サーブレット・リクエストおよびmod_plsqlリクエストなど、すべてのタイプのリクエストを処理します。どのOracle HTTP Serverプロセスが次のリクエストを処理するかは制御できません。

2. あるOracle HTTP Serverプロセスでは、別のプロセスで作成された接続プールの使用や共有はできません。

3. 各Oracle HTTP Serverプロセスは、DADごとに最大でn個のmod_plsql接続をプールできます。nは、データベース・アクティビティの実行に必要な同時mod_plsqlリクエストの合計数です。

4. ユーザー・セッションは、DADに対してプールされたデータベース接続内で切り替えられます。Oracle Application Server Single Sign-On(SSO)に基づくDADの場合、プロキシ認証を使用してユーザー・セッションが切り替えられます。SSO以外のユーザーの場合、DADにはないユーザー名およびパスワードによるHTTP Basic認証を使用して、ユーザーは同じ接続で再度認証されます。

5. 複数のDADが同じデータベース・インスタンスを指すことがありますが、データベース接続は同じプロセス内であってもDAD間で共有されません。

6. 未使用のDADには、データベース接続がありません。

最悪のシナリオでは、各DADにプールされるデータベース接続の合計数は、Oracle HTTP Server(httpd)プロセスの合計数と、単一プロセス内の同時mod_plsqlリクエストの最大数を掛けた数になります。Oracle HTTP Serverプロセスを大きい数に設定した場合、それに相当する数のデータベース・セッションを処理するように、バックエンド・データベースを設定する必要があります。この設定値には、バックエンド・データベースを使用するOracle HTTP Serverインスタンスの数を掛ける必要があります。mod_plsqlで必要なデータベース接続最大数を減らす場合は、Oracle HTTP Serverプロセス数の低減を考慮し、必要な同時実効性を達成するように各プロセス内でより多くのスレッドを実行する必要があります。単一プロセス内でより多くのプロセスを実行することの短所の1つとして、あるプロセスの失敗がプロセス内で実行されているすべてのスレッドに影響を与えることがあげられます。

たとえば、Oracle HTTP Serverインスタンスが3つあり、それぞれプロセスごとに1つのスレッドを持つ最大50のhttpdプロセスを作成するように設定されているとき、アクティブなDADが2つある場合、300(3*50*2)セッションを処理できるようにデータベースを設定する必要があります。この数には、他のWebアプリケーションが接続するのに必要なセッションは含まれていません。mod_plsqlで必要なデータベース接続最大数を減らす場合は、各インスタンスで50のhttpdプロセスを実行するのではなく、かわりに各プロセスで5つのスレッドを持つようにOracle HTTP Serverをチューニングして、HTTPDプロセス数を10に減らすことができます。このような設定で、データベース接続数の要求を減らすことができます。mod_plsqlの必要なデータベース接続数は、60(3*10*2)まで減らすことが可能です。実際には、各プロセスで実際に処理される同時mod_plsqlリクエスト数だけ減ります。

Windowsプラットフォームでは、Oracle HTTP Serverはシングル・プロセスとして実行されます。このようなシステムでは、mod_plsqlの接続プールはスレッド間で共有され、データベース接続の合計数は、各DADに対する同時リクエストの数になります。データベース接続がスレッド間で共有されるため、4.3.4項「2リスナー方針」はWindowsシステムには適用されません。

3.11.2 プールされたデータベース・セッションのクローズ

プールされたデータベース・セッションは、次の状況下でクローズされます。

1. プールされた接続が、設定された数のリクエストを処理するために使用されている場合。
デフォルトでは、mod_plsqlによってプールされた各接続は、最大1000リクエストを処理するために使用されます。その後、データベース接続は停止され、次のmod_plsqlリクエストで再確立されます。これは、PL/SQLベースのWebアプリケーションまたはOracleのクライアント/サーバー側でのリソース・リークがシステムに悪影響を及ぼさないようにするために行われます。デフォルト値の1000は、DAD設定パラメータのPlsqlMaxRequestsPerSessionをチューニングして変更します。

2. プールされた接続が長期間アイドル状態である場合。
デフォルトでは、mod_plsqlのクリーンアップ・スレッドにより、プールされた各接続は、アイドル時間が15分を経過するとクリーンアップされます。アイドル・セッションのタイムアウト値は、構成設定のPlsqlIdleSessionCleanupIntervalによって制御されます。サイトでmod_plsqlのコンテンツにアクセスする頻度が低いほど、アイドル・セッションのクリーンアップはより頻繁に発生するため、ユーザーはあまり使用されないデータベース接続を確立することになります。このような状況では、パフォーマンスを向上させるためにPlsqlIdleSessionTimeoutIntervalのデフォルト設定を大きくすることを検討します。プールされたデータベース接続を長時間オープンにしておくことは、より多くのセッションで使用できるようにするために、データベースに余分な負荷が発生することを意味します。

3. UNIXシステムで、Oracle HTTP Serverプロセスが停止する場合。
UNIXシステムでは、Oracle HTTP Server構成パラメータのMaxRequestsPerChildによってOracle HTTP Serverプロセスが停止するタイミングが制御されます。たとえば、このパラメータが5000に設定されている場合、各Oracle HTTP Serverプロセスは、正確に5000リクエストを処理した後、停止します。また、Oracle HTTP Serverプロセスは、構成パラメータのMinSpareServers、MaxSpareServersおよびMaxClientsに基づいて、Oracle HTTP Serverのメンテナンスの一環として起動および停止することがあります。

Oracle HTTP Serverが正しく設定されていないと、Oracle HTTP Serverプロセスが頻繁に起動および停止するようになり、その結果、無駄なmod_plsqlの接続プーリングが発生します。最高のパフォーマンスにするには、各Oracle HTTP Serverプロセスが一定時間アクティブの状態を維持し、プロセスが停止しないように、Oracle HTTP Serverを設定します。

関連項目:
『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』の「mod_plsql」を参照してください。

4. mod_plsqlが接続プールで停止中の接続を検出した場合。
詳細は、3.11.3項「接続プールでの停止中のデータベース接続の検出」を参照してください。

3.11.3 接続プールでの停止中のデータベース接続の検出

mod_plsqlは、データベースへの接続のプールを保持し、確立されたデータベース接続を後続のリクエストに再利用します。接続プールのデータベース接続からレスポンスがない場合、mod_plsqlはそれを検出して、その停止中の接続を破棄し、新しいデータベース接続を後続のリクエストのために確立します。

mod_plsqlの停止中のデータベース接続の検出機能により、データベース・ノードまたはインスタンスが停止したときのランダムなエラーの発生がなくなります。また、この機能は、Real Application Cluster(RAC)のような高可用性の構成では非常に有効です。あるRACクラスタのノードが停止していると、mod_plsqlはそれを検出し、他のRACノードを使用してリクエストの処理をすぐに開始します。

デフォルトでは、RACノードまたはデータベース・インスタンスが停止し、そのノードへの接続がmod_plsqlでそれ以前にプールされていた場合、プール内の切断された接続を使用する最初のmod_plsqlリクエストには障害が発生し、HTTP-503というレスポンスがエンドユーザーに返されます。mod_plsqlは、この障害をトリガーとして、プール内の切断されている接続をすべて検出して削除します。mod_plsqlにより、ノードに障害が発生する前に作成されていた接続プールがすべてpingされます。このping操作は、プールされた接続を使用する次回リクエストの処理時に実行されます。ping操作が失敗すると、そのデータベース接続は破棄され、新しい接続が作成されて処理されます。

注意:
ノード障害後、複数のmod_plsqlリクエストを同時に受信し、mod_plsqlがまだ最初の停止中の接続を検出していない場合、その時点では複数の障害が発生する可能性があります。

関連項目:
mod_plsqlリクエストがサーバーに対して作成されていない場合でも、mod_plsqlが停止中のデータベース接続をクローズする他の状況の詳細は、3.11.2項「プールされたデータベース・セッションのクローズ」を参照してください。

mod_plsqlでは、停止中のデータベース接続の検出機能をチューニングするための構成オプションを2つ提供しています。

- 停止中のデータベース接続を検出するためのオプションの指定

- タイムアウト期間の指定

3.11.3.1 停止中のデータベース接続を検出するためのオプションの指定

mod_plsqlは、データベース・ノードの停止が原因と考えられる障害を検出すると接続を修正します。これは、PlsqlConnectionValidationパラメータによって制御されます。PlsqlConnectionValidationパラメータの詳細は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』の「mod_plsql」を参照してください。

関連項目:
表4-1「データベース・アクセス記述子(DAD)パラメータの推奨設定の概要」

3.11.3.2 タイムアウト期間の指定

PlsqlConnectionValidationパラメータがAutomaticまたはAlwaysValidateに設定されていると、mod_plsqlはプールされているデータベース接続をテストしようとします。

mod_plsqlが接続プールの不完全なデータベース接続をテストするタイムアウト期間を指定できます。これは、PlsqlConnectionTimeoutパラメータで制御されます。このパラメータには、テスト・リクエストが完了するまでmod_plsqlが待機する最大時間を指定します。この時間を超えると、接続が使用不可とみなされます。

PlsqlConnectionTimeoutパラメータの詳細は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』の「mod_plsql」を参照してください。

関連項目:
表4-1「データベース・アクセス記述子(DAD)パラメータの推奨設定の概要」

3.12 mod_plsqlでの制限事項

mod_plsqlには、次の制限があります。

- HTTP Cookieヘッダーの最大長は32000バイトです。このバイト数を超えるとエラーが発生します。

- HTTP Cookie内にある各Cookieの最大長は3990バイトです。このバイト数を超えるとエラーが発生します。この制限は、配列内の文字列のOCI配列バインド制限によるものです。

- mod_plsqlでは、一度に設定できるCookieの最大数は制限されており、変更できません。この制限は、最大数20に設定されています。20を超えると、それ以降のCookieは削除されます。

- PL/SQL Gatewayは、OUTパラメータを含むプロシージャをWebインタフェースからコールすることをサポートしていません。この方法でコールするとORA-6502エラーが発生します。OUT変数を含むプロシージャはコールしないことをお薦めします。ただし、現行のアーキテクチャでは、変更後の値が受渡し時の長さを超えないかぎり値を変更できます。この問題が発生する既存のアプリケーションは、次のいずれかの方法で変更する必要があります。

- OUTパラメータを含むプロシージャがブラウザURL経由で直接実行されないように、この種のプロシージャのラッパーを実装します。

- 渡されるパラメータの値が割り当てられるローカル変数を作成し、それを内部的なすべての変更に使用します。

- PL/SQLプロシージャに渡すことのできる名前/値ペアの合計数は2000です。

- mod_plsqlでは、1つのプロシージャに渡すことのできる1つのパラメータのサイズが32512バイトに制限されます。

- 同じDAD locationを異なる仮想ホストで使用することはできません。

- PlsqlCacheMaxSizeおよびPlsqlCacheTotalSizeパラメータに使用できる最大値は、4294967296バイト(4GB)です。これより大きい値を指定すると、mod_plsqlで警告が発生し、内部で値が4GBに設定されます。

- mod_plsqlでは、以下はサポートされません。

- TYPE.PROCEDUREフォームのWeb-callableプロシージャ。

- ブラウザからTYPEオブジェクトのメンバー・プロシージャのコール。

例3-13 Web Callableプロシージャ

CREATE OR REPLACE TYPE wpro06_type AS object (
atr1 VARCHAR2(100),
static PROCEDURE sp1 (a VARCHAR2),
member PROCEDURE mp1
);
/
show errors

CREATE OR REPLACE TYPE BODY wpro06_type AS
static PROCEDURE sp1 (a VARCHAR2) IS
v wpro06_type;
BEGIN
htp.print('From wpro06_type.sp1 : '|| a );
v := wpro06_type(a);
v.mp1;
END;

member PROCEDURE mp1 IS
BEGIN
htp.print('From wpro06_type.mp1 : ' || self.atr1);
END;
END;
/
show errors

前述の例として、次のURLはサポートされません。

- http://<host>:<port>/pls/<DAD>/mytype.sp1?a=HelloWorld

- http://<host>:<port>/pls/<DAD>/mytype.mpl

4 PL/SQLのパフォーマンスの最適化

この章では、Oracle HTTP ServerでのPL/SQLのパフォーマンスを向上させるための方法について説明します。

この章の内容は、次のとおりです。

- Oracle HTTP ServerでのPL/SQLのパフォーマンス - 概要

- Oracle HTTP Serverでのプロセス・ベースおよびスレッド・ベースの操作

- mod_plsqlでのパフォーマンス・チューニング問題

- キャッシングのパフォーマンスを向上させるためのファイル・システム・キャッシュのチューニング

- Oracle HTTP Serverのディレクティブ

4.1 Oracle HTTP ServerでのPL/SQLのパフォーマンス - 概要

この項では、Oracle HTTP ServerでPL/SQLベースのWebアプリケーションのパフォーマンスを向上させるためのいくつかの方法について説明します。

表4-1に、データベース・アクセス記述子(DAD)のパラメータおよび設定の推奨事項を示します。デフォルトでは、これらのDADパラメータは、dads.confファイルに指定されます。このファイルは、UNIXシステムの場合、ORACLE_INSTANCE/config/OHS/ohs1/mod_plsqlディレクトリにあります。Windowsシステムの場合、デフォルトでは、ORACLE_INSTANCE\config\OHS\ohs1\mod_plsqlディレクトリにあります。このディレクトリのdads.READMEファイルには、DADパラメータについて詳細に説明されています。

表4-1 データベース・アクセス記述子(DAD)パラメータの推奨設定の概要

パラメータ

推奨設定

PlsqlAlwaysDescribeProcedure

最高のパフォーマンスにするには、offに設定します。

デフォルト値: off

PlsqlDatabaseConnectString

新しいDADには、ServiceNameFormatを使用します。SIDFormatは、下位互換性の場合にのみ使用します。

注意: データベースのHA構成では、接続文字列パラメータはLDAP検索を介して解決されるように設定することをお薦めします。

PlsqlFetchBufferSize

日本語や中国語などのマルチバイト・キャラクタ・セットの場合、256に設定すると、パフォーマンスが向上します。

デフォルト値: 200

PlsqlIdleSessionCleanupInterval

このパラメータの値を増加すると、プールされたデータベース接続が、プール内で指定された時間、使用可能な状態を維持できます。

デフォルト値: 15(分)

関連項目: 3.11.3項「接続プールでの停止中のデータベース接続の検出」

PlsqlLogEnable

Oracleサポート・サービスからデバッグの目的で薦められないかぎり、Offに設定します。

デフォルト値: off

PlsqlConnectionValidation

接続プール内で停止中の接続を検出するためにmod_plsqlが使用するオプションを指定します。オプションは次のとおりです。

- Automatic: mod_plsqlは、インスタンス障害を示す障害を検出する前に作成済の、プールされたデータベース接続をすべてテストします。

- ThrowAwayOnFailure: mod_plsqlは、インスタンス障害を示す障害を検出する前に作成済の、プールされたデータベース接続をすべて破棄します。

- AlwaysValidate: mod_plsqlは必ず、リクエストを発行する前に、プールされたデータベース接続をすべてテストします。
重要: このオプションは、各リクエストのパフォーマンス・オーバーヘッドと関連しているため、注意して使用する必要があります。

- NeverValidate: mod_plsqlは、プールされたデータベース接続のpingを行いません。

デフォルト値: Automatic

関連項目: 3.11.3.1項「停止中のデータベース接続を検出するためのオプションの指定」

PlsqlConnectionTimeout

mod_plsqlにプールされた接続のテストに対するタイムアウトを(ミリ秒単位で)指定します。

デフォルト値: 10000

関連項目: 3.11.3.2項「タイムアウト期間の指定」

PlsqlMaxRequestsPerSession

PL/SQLベースのWebアプリケーションがリソースまたはメモリーをリークしない場合は、このパラメータをさらに高い値(5000など)に設定できます。

デフォルト値: 1000

関連項目: 3.11.2項「プールされたデータベース・セッションのクローズ」および4.3.2項「接続プーリングのヒントおよびOracle HTTP Server構成」

PlsqlNLSLanguage

データベースのグローバリゼーション・サポートのパラメータと一致するように設定すると、Oracle Net Servicesでのキャラクタ・セット変換におけるオーバーヘッドを削減できます。

PlsqlSessionStateManagement

データベースがリリース8.1.7.2以上の場合、このパラメータをStatelessWithFastResetPackageStateに設定します。

表4-2に、mod_plsqlのキャッシング・オプションと、そのオプションを説明している関連項目を示します。

表4-2 キャッシング・オプション

オプション

説明

期限方式

定期的に変わるコンテンツに対して、最高のパフォーマンスを提供します。

関連項目: 3.10.2項「期限方式の使用」

検証方式

不定期に変わるコンテンツに対して、良好なパフォーマンスを提供します。

関連項目: 3.10.1項「検証方式の使用」

システム・レベル・キャッシング

システム上のすべてのユーザーに対して1つのコピーをキャッシュすることにより、パフォーマンスを向上させます。

関連項目: 3.10.3項「PL/SQLベースのWebアプリケーションでのシステム・レベルおよびユーザー・レベルのキャッシング」

関連項目:

- mod_plsqlのメトリックの詳細は、『Oracle Fusion Middleware Performance Guide』のパフォーマンス・メトリックに関する付録を参照してください。

- 表4-1に示されたDADパラメータの詳細は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』の「mod_plsql」を参照してください。

- 『Oracle Fusion Middleware PL/SQL Web Toolkitリファレンス』

4.2 Oracle HTTP Serverでのプロセス・ベースおよびスレッド・ベースの操作

この項では、Oracle HTTP Serverがプロセス・ベースであるプラットフォームとスレッド・ベースであるプラットフォームの場合に当てはまるPL/SQLのパフォーマンス問題について説明します。プロセス・ベースのOracle HTTP Server(UNIXベースのプラットフォームで稼働するものなど)では、サーブレット、PL/SQL、静的ファイルを含め、すべてのタイプのHTTPリクエストを各プロセスで処理します。スレッド・ベースのOracle HTTP Server(Windowsベースのプラットフォームなど)では、Oracle HTTP Serverプロセスは1つしかなく、複数のスレッドがプロセス内にあり、個々のスレッドを使用してすべてのタイプのHTTPリクエストを処理できます。

注意:
この章のいくつかの例では、PL/SQLベースのWebアプリケーションに適用されるパフォーマンスの最適化について言及していますが、そこでは、プラットフォーム間の相違、すなわちプロセス・ベースまたはスレッド・ベースのいずれであるかが重大な意味を持ちます。

4.3 mod_plsqlでのパフォーマンス・チューニング問題

mod_plsqlを使用する際、パフォーマンスおよびスケーラビリティに影響を及ぼす領域は次のとおりです。

- PL/SQLベースのWebアプリケーション開発における考慮事項とプログラミングのヒント

- 接続プーリングのヒントおよびOracle HTTP Server構成

- データベース・セッションの数のチューニング

- 2リスナー方針

- オーバーヘッドの問題

- 柔軟なパラメータの受渡し(4パラメータ)のオーバーヘッド

関連項目:
3.11項「mod_plsqlのパフォーマンス・チューニングの領域」

4.3.1 PL/SQLベースのWebアプリケーション開発における考慮事項とプログラミングのヒント

PL/SQL Gatewayユーザーは、PL/SQLベースのWebアプリケーションを開発する際に、次の項目について考慮する必要があります。

1. データベース・アクセス記述子(DAD)の使用の管理
各Oracle HTTP Serverノードで使用されるDADの数を制限してください。

注意:
使用されていないDADがあっても、パフォーマンスに影響はありません。

2. ネストした表の使用
PL/SQLでは表を作成できます。PL/SQL表を作成するには、表の索引およびデータ型を持つ表を作成します。表の索引は、-2147483647から+2147483647までの2進整数です。この表索引オプションは、スパースと呼ばれ、顧客番号、従業員番号あるいはその他の便利な索引キーなど、重要な索引番号を使用できます。PL/SQL表は、大量データの処理に使用します。

PL/SQLには、TABLEおよびVARRAY(可変サイズ配列)のコレクション型があります。TABLEコレクション型は、ネストした表と呼ばれます。ネストした表は、サイズに制限がなく、スパースにできます。つまり、ネストした表内の要素はDELETEプロシージャを使用して削除できます。可変サイズ配列は、サイズに制限があり、データベースに格納される際に順序および添字を保持します。ネストした表のデータは、その表に関連付けられたシステム表に格納されます。可変サイズ配列は、アプリケーションがバッチ配列スタイルでデータを処理するバッチ操作に適しています。ネストした表は、ネストした表を格納表に格納して、各要素を格納表の行にマッピングすることで、問合せを効率的に行うことができます。

3. プロシージャ名のオーバーロードの慎重な使用
PL/SQLベースのWebアプリケーションでは、プロシージャ名のオーバーロード機能の使用に注意する必要があります。複数のプロシージャに異なる名前を付けて、プロシージャ名のオーバーロードを回避することが最良の方法です。

4. パラメータ・タイプの判別に著しいオーバーヘッドが発生するアプリケーションの再作成の検討
PL/SQLベースのWebアプリケーションでは、パラメータ・タイプ(スカラーや配列など)の詳細がURLから十分に提供されないプロシージャの実行におけるオーバーヘッドに注意する必要があります。このような場合、プロシージャを実行する最初の試みに失敗すると、mod_plsqlによって実行できるようにするためには、プロシージャ・シグネチャを記述する必要があります。

関連項目:
4.3.5項「オーバーヘッドの問題」

5. 2パラメータ・スタイルの柔軟なパラメータの受渡しを利用するプロシージャの使用
プロシージャでは、4パラメータ・スタイルのパラメータの受渡しではなく、パフォーマンスの高い2パラメータ・スタイルの柔軟なパラメータの受渡しを利用します。

関連項目:

- 『Oracle Fusion Middleware PL/SQL Web Toolkitリファレンス』

- 柔軟なパラメータの受渡し(4パラメータ)のオーバーヘッド

4.3.2 接続プーリングのヒントおよびOracle HTTP Server構成

Oracle HTTP Serverで接続プーリングを構成する際、次の項目について考慮してください。

1. デフォルトの接続プーリングおよびPlsqlMaxRequestsPerSessionの設定値の使用
新しいデータベース接続の作成はコストの高い操作であるため、各リクエストが独自のデータベース接続をオープンおよびクローズしないことが最も重要です。最適な方法は、あるリクエストでオープンされたデータベース接続が、後続のリクエストで確実に再利用されるようにすることです。まれなケースですが、データベースへのアクセスが非常に少なく、パフォーマンスが重要な問題ではない場合には、接続プーリングは無効化してもかまいません。たとえば、管理者がサイトにアクセスして管理タスクを行うことがあまりない場合、管理アプリケーションへのアクセスに使用されるDADで、接続プーリングを無効化できます。接続プーリングを無効化するには、DADパラメータPlsqlMaxRequestsPerSessionを値1に設定します。

注意:
PlsqlMaxRequestsPerSessionを値1に設定すると、使用可能なデータベース・セッション数が減り、パフォーマンスに影響を及ぼすことがあります。

2. UNIXシステムでは、プロセスが一度起動したら、そのプロセスが一定の時間起動した状態を維持するように、Oracle HTTP Server構成を正しくチューニングする必要があります。そうしないと、mod_plsqlの接続プーリングは有効に利用できなくなります。Oracle HTTP Serverリスナーは、プロセスの起動および停止を頻繁に行わないようにする必要があります。サイトの負荷を適切に分析して、Webサイトに対する平均の負荷を特定します。Oracle HTTP Server構成をチューニングして、httpdプロセスの数を、システムに対する平均の負荷を処理できるように設定する必要があります。さらに、httpd.confファイルの構成パラメータMaxClientsは、同様に、ランダムに発生する負荷の急激な上昇を処理できなければなりません。

3. UNIXシステムでは、Oracle HTTP Serverプロセスは、プロセスが最終的に停止して再起動されるように設定します。これは、Oracle HTTP Server経由でアクセスされる様々なコンポーネントで発生する可能性があるメモリー・リークを管理するために必要です。特に、mod_plsqlでは、データベース・セッションのリソース・リークが問題を引き起こさないようにするために必要となります。MaxRequestsPerChild構成パラメータが高い数値に設定されていることを確認してください。PL/SQLベースのWebアプリケーションの場合は、このパラメータを0(ゼロ)に設定しないでください。

4. 負荷の高いサイトの場合、Oracle HTTP Serverの構成パラメータKeepAliveを無効にする必要があります。これにより、各プロセスは、現在のリクエストの処理が完了するとただちに他のクライアントからのリクエストを処理できるようになります。負荷が低く、Oracle HTTP Serverプロセスの数が常にOracle HTTP Serverリスナーに対する同時リクエストの数より多いサイトの場合、KeepAliveパラメータを有効にすると、パフォーマンスは向上します。このような場合、必ずKeepAliveTimeoutパラメータを適切にチューニングしてください。

5. Oracle HTTP Server構成でTimeoutの値を低くすることもできます。これにより、クライアントが適時にレスポンスを返さない場合、Oracle HTTP Serverプロセスはより早く解放されます。この値を低くしすぎないでください。値が低すぎると、その値より遅いクライアントのレスポンスがタイムアウトします。

6. ほとんどのWebサイトには、一貫したユーザー・インタフェースで各画面に表示される、静的イメージ・ファイルが多数あります。このようなファイルはほとんど変わることがないため、Oracle HTTP Serverリスナーにより処理される各イメージをmod_expiresでタグ付けすることで、システムに対する負荷を大幅に減らすことができます。また、Oracle Web CacheでWebサイトをフロントエンドにすることも検討してください。

- Webサイトでのmod_expiresの使用が有効かどうかを確認する方法

- Netscapeまたはページ・キャッシング情報を表示できる任意のブラウザを使用し、サイトで頻繁にアクセスされるWebページをいくつか開きます。各ページでマウスを右クリックし、ポップアップ・メニューから「ページ情報を表示」(または使用しているブラウザのこれに相当するコマンド)を選択します。ページ情報ウィンドウのトップ・パネルに、様々なイメージおよび静的コンテンツが多数表示される場合、そのサイトでのmod_expiresの使用は有効です。

- また、Oracle HTTP Serverアクセス・ログをチェックして、HTTP 304(Not Modified)ステータスになるリクエストの割合を確認することもできます。grepユーティリティを使用してaccess_logの304を検索し、この結果の行数をaccess_logの合計の行数で割ります。この割合が高い場合、そのサイトでのmod_expiresの使用は有効です。

- 静的ファイルをExpiresヘッダーでタグ付けする方法

- 静的イメージ・ファイルの処理に使用されるLocationディレクティブを探します。ExpiresActiveおよびExpiresDefaultディレクティブを追加します。

Alias /images/ "/u01/app/oracle/myimages/"
<Directory "/u01/app/oracle/myimages/">
AllowOverride None
Order allow, deny
Allow from all
ExpiresActive On
ExpiresDefault A2592000
</Directory>

- ブラウザは、現在から30日間、処理されるすべての静的ファイルを/imagesパスからキャッシュします。詳細は、『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』を参照してください。

- 静的ファイルがExpiresヘッダーでタグ付けされているかどうかを確認する方法

- Netscapeまたは任意のブラウザを使用して、ブラウザ内のすべてのキャッシュ済ファイルをクリーンアップします。

- Expiresヘッダーでタグ付けされたイメージがあるWebページを開きます。ページでマウスを右クリックし、ポップアップ・メニューから「ページ情報を表示」を選択します。または、使用しているブラウザのこれに相当するコマンドを使用します。

- ページ情報のトップ・パネルで、Expiresヘッダーでタグ付けされているイメージを選択します。

- 下部のパネルに表示される情報を確認します。Expiresヘッダーは有効な日付に設定されています。このエントリがNo date givenとなっている場合、そのファイルはExpiresヘッダーでタグ付けされていません。

4.3.3 データベース・セッションの数のチューニング

データベース・セッションの数をチューニングする際、次の項目について考慮してください。

1. Oracle init$SID.ora構成ファイルのprocessesおよびsessionsパラメータは、Oracleで最大数のデータベース・セッションを処理できるように設定する必要があります。この数は、DADの数にOracle HTTP Serverプロセスの最大数を掛け、さらにOracle HTTP Serverインスタンスの数を掛けた値に比例します。

2. 2リスナー方針または共有サーバーを使用すると、データベース・セッションの数を減らすことができます。4.3.4項「2リスナー方針」を参照してください。

3. UNIXプラットフォームでは、接続プールはOracle HTTP Serverプロセス間で共有されません。このため、アプリケーションではできるだけ少ないDADを使用することをお薦めします。

4.3.4 2リスナー方針

Oracle HTTP Serverがプロセス・ベースであるプラットフォーム(すべてのUNIXベースのプラットフォームなど)では、サーブレット、PL/SQL、静的ファイルおよびCGIを含め、すべてのタイプのHTTPリクエストを各プロセスで処理します。1つのOracle HTTP Serverリスナー設定で、各httpdプロセスはデータベースへの独自の接続プールを保持します。データベース・セッションの最大数は、httpd.conf構成ファイルのStartServers、MinSpareServers、MaxSpareServers、MinSpareThreads、MaxSpareThreadsおよびThreadsPerChildの設定およびシステムに対する負荷により決まります。このアーキテクチャでは、mod_plsqlリクエストの数に基づいてデータベース・セッションの数をチューニングできません。Oracle HTTP Serverでは各プロセスでの複数のスレッドの実行がサポートされているため、各プロセスにより多くのスレッドを持つことでApacheプロセス数を減らすことにより、mod_plsqlに対するデータベースの最大接続数の要求を簡単に制御する方法が提供されています。このチューニングは、ほとんどの場合に十分対応できます。同時mod_plsqlリクエストの数に基づいてデータベース・セッションの数をチューニングする場合は、mod_plsqlリクエスト専用に別のHTTPリスナーをインストールします。この方法により、mod_plsqlリクエストの処理に必要なデータベース・セッションの数を減らすことができます。

たとえば、メインのOracle HTTP Serverリスナーがmylsnr1.mycompany.comのポート7777で稼働しているとします。まず、別のOracle HTTP Serverリスナーをmylsnr2.mycompany.comのポート8888にインストールします。次に、mylsnr1.mycompany.com:7777に対して行われたすべてのmod_plsqlリクエストを、mylsnr2.mycompany.com:8888の2番目のリスナーにリダイレクトします。手順は次のとおりです。

1. mylsnr1.mycompany.com:7777に対するすべてのPL/SQLリクエストをmylsnr2.mycompany.com:8888にリダイレクトするには、次のように構成を変更します。

1. ポート7777で稼働しているOracle HTTP Serverリスナーについては、ORACLE_HOME\ohs\conf\moduleconf\plsql.confファイルを編集します。行の先頭に#を挿入して、次の行をコメント化します。

#LoadModule plsql_module...

2. mylsnr1.mycompany.comのPL/SQLリクエストの処理に使用されるDADの場所を、mylsnr2.mycompany.comのORACLE_INSTANCE\config\OHS\ohs1\mod_plsql\dads.conf構成ファイルにコピーします。
行の先頭に「#」を挿入して、mylsnr1.mycompany.com上のDADの場所の構成パラメータをコメント化します。

#<Location /pls/portal>
#...
#</Location>

3. 次の行をdads.confに追加して、このDADの場所に対するすべてのmod_plsqlリクエストを2番目のリスナーに転送するように、このリスナーを設定します。

ProxyPass /pls/portal http://mylsnr2.mycompany.com:8888/pls/portal

すべてのDADの場所について、この設定の手順を繰り返します。

2. PL/SQLプロシージャはブラウザに表示されるURLを生成するため、すべてのURLがmylsnr2.mycompany.com:8888の内部mod_plsqlリスナーを参照せずに構成されていることが重要です。PL/SQLベースのWebアプリケーションでURLがどのように生成されるかにより、次の3つのオプションがあります。

- URLがアプリケーションにハードコードされている場合、常にハードコードされた値(HOST=mylsnr1.mycompany.com and PORT=7777)を使用してURLが生成されていることを確認してください。この場合、変更は不要です。

- PL/SQLベースのWebアプリケーションが常にCGI環境変数SERVER_NAMEおよびSERVER_PORTを使用する場合、mylsnr2.mycompany.comのリスナーの構成を変更することは簡単です。ファイルを編集し、2番目のリスナーのORACLE_INSTANCE\config\OHS\ohs1\httpd.confファイルのServerNameおよびPort行を次のように変更します。

ServerName mylsnr1.mycompany.com (was mylsnr2.mycompany.com)
Port 7777                        (was 8888)

- URLがCGI環境変数HTTP_HOSTを使用して生成されている場合、ポート8888で稼働しているOracle HTTP ServerリスナーのCGI環境変数をオーバーライドする必要があります。各DADのORACLE_INSTANCE\config\OHS\ohs1\mod_plsql\dads.confファイルに次の行を追加して、デフォルトのCGI環境変数HOST、SERVER_NAMEおよびSERVER_PORTをオーバーライドします。

PlsqlCGIEnvironmentList  SERVER_NAME  mylsnr1.mycompany.com
PlsqlCGIEnvironmentList  SERVER_PORT  7777
PlsqlCGIEnvironmentList  HOST mylsnr1.us.oracle.com:7777

いかなる場合でも、目的は、アプリケーションに2番目のリスナーが存在しないかのように見せかけて、URLを生成することです。

3. 設定をテストし、すべてのDADに問題なくアクセスできることを確認します。

4. この設定では、mylsnr1.mycompany.comのメインのリスナーは、Oracle HTTP Serverリスナーに対する合計の負荷に基づいて設定できます。mylsnr2.mycompany.comの2番目のリスナーは、実行されるmod_plsqlリクエストのみに基づいて細かくチューニングできます。

4.3.5 オーバーヘッドの問題

一部のストアド・プロシージャの実行時、mod_plsqlにDescribeのオーバーヘッドが発生することがあり、その結果、実行を正常終了するために、データベースへのラウンドトリップが2回余分に発生します。これは、パフォーマンスと密接な関係があります。

4.3.5.1 Describeのオーバーヘッド

PL/SQLプロシージャを実行するために、mod_plsqlは、渡されるパラメータのデータ型およびアクセスに必要な権限を認識する必要があります。この情報に基づいて、mod_plsqlは、各パラメータを配列またはスカラーとしてバインドします。プロシージャ・シグネチャを認識するための1つの方法は、プロシージャを実行前に記述することです。ただし、この方法は、各プロシージャを実行前に記述する必要があるため、効率的ではありません。Describeのオーバーヘッドを回避するには、mod_plsqlでパラメータ名ごとに渡されるパラメータの数を調べるようにします。この情報を使用して、各変数のデータ型を推定します。このロジックは単に、渡される値が1つの場合はそのパラメータをスカラーとし、それ以外の場合は配列とします。これは、ほとんどの場合において機能しますが、1つの値を配列パラメータに渡そうとしたり、複数の値をスカラーに渡そうとしている場合には機能しません。このような場合、PL/SQLプロシージャを実行する最初の試みに失敗します。mod_plsqlはDescribeコールを発行して、PL/SQLプロシージャのシグネチャを取得し、Describe操作で取得した情報に基づいて各パラメータをバインドします。プロシージャは再実行され、結果が戻されます。

このDescribeコールは、プロシージャに対して透過的に発生しますが、mod_plsqlの内部では、ラウンドトリップが2回余分に発生します。1回は実行に失敗したコールのためで、もう1回はDescribeコールのためです。

4.3.5.2 Describeのオーバーヘッドの回避

次のようにして、パフォーマンスの問題を回避できます。

- 柔軟なパラメータの受渡しを使用します。

- 配列に対して常に複数の値を渡すようにします。1つの値の場合、プロシージャで無視されるダミー値を渡すことができます。

- 回避策として、次のように、未使用の変数をデフォルトとする2パラメータ・スタイルのプロシージャを定義します。

1. 元のプロシージャを内部的にコールする、プロシージャに相当するスカラーを定義します。たとえば、元のパッケージが次の例のようなものだとします。

CREATE OR REPLACE PACKAGE testpkg AS
TYPE myArrayType is TABLE of VARCHAR2(32767) INDEX BY binary_ integer;
PROCEDURE arrayproc (arr myArrayType);
END testpkg;
/

2. /pls/.../testpkg.arrayproc? arr= 1のようなURLコールを作成している場合、仕様を次のように変更します。

CREATE OR REPLACE PACKAGE testpkg AS
TYPE myArrayType is TABLE of VARCHAR2( 32767) INDEX BY binary_integer;
PROCEDURE arrayproc (arr varchar2);
PROCEDURE arrayproc (arr myArrayType);
END testpkg;
/

3. プロシージャarrayprocは、次のようになります。

CREATE OR REPLACE PACKAGE BODY testpkg AS
PROCEDURE arrayproc (arr varchar2) IS
localArr myArrayType;
BEGIN
localArr( 1) := arr;
arrayproc (localArr);
END arrayproc;

4.3.6 柔軟なパラメータの受渡し(4パラメータ)のオーバーヘッド

ラウンドトリップのオーバーヘッドは、PL/SQLプロシージャが古いスタイルの4パラメータ・インタフェースを使用している場合に発生します。PL/SQL Gatewayは、最初に2パラメータ・インタフェースを使用してプロシージャの実行を試みます。これに失敗すると、PL/SQL Gatewayは4パラメータ・インタフェースを使用します。つまり、すべての4パラメータ・インタフェースのプロシージャでは、ラウンドトリップが1回余分に発生します。

- 柔軟なパラメータの受渡しのオーバーヘッドの回避
このオーバーヘッドを回避するには、対応するラッパーを作成して、2パラメータ・インタフェースを使用しながら内部的に4パラメータ・インタフェースのプロシージャをコールするようにすることをお薦めします。もう1つのオプションは、元のプロシージャの仕様を変更して、渡されないパラメータをデフォルトとして2パラメータ・インタフェースに設定することです。4パラメータ・インタフェースは、下位互換性のためにのみ提供されていますが、将来的には非推奨となります。

- 柔軟なパラメータと感嘆符の使用
Oracle HTTP Serverの柔軟なパラメータの受渡しモードでは、PL/SQLプロシージャのプロシージャ名の前に感嘆符が付いていると想定しています。Oracle HTTP Serverで使用されている自動検出方法はパフォーマンスと密接に関係するため、現在、Oracle HTTP Serverでの柔軟なパラメータの受渡しには感嘆符が必須です。Oracle HTTP Serverでは、各プロシージャは実行前に完全に記述されます。プロシージャDescribeコールにより、プロシージャのシグネチャが決まり、データベースへのラウンドトリップが必要となります。Oracle HTTP ServerのPL/SQL Gatewayでは、エンド・ユーザーがプロシージャの前に感嘆符を追加して、明示的に柔軟なパラメータの受渡し規則を指定することにより、このラウンドトリップを回避します。

4.4 キャッシングのパフォーマンスを向上させるためのファイル・システム・キャッシュのチューニング

ファイル・システム・キャッシュを構成して使用すると、Oracle Portalアプリケーションおよび一般的なPL/SQLベースのWebアプリケーションのパフォーマンスを向上させることができます。

この項の内容は、次のとおりです。

- ファイル・システム・キャッシュのチューニングの概要

- ファイル・システム・キャッシュの有効化

- より高速なファイル・システムに存在するためのファイル・システム・キャッシュの構成

- ファイル・システム・キャッシュのサイズ変更

- キャッシュ・クリーンアップの構成

4.4.1 ファイル・システム・キャッシュのチューニングの概要

この項では、mod_plsqlに関連するファイル・システム・キャッシュのチューニング・オプションについて説明します。キャッシュ・コンテンツは、オペレーティング・システム付属のファイル・システム・コールを使用してキャッシュされますが、キャッシュされたコンテンツはmod_plsqlのメモリー領域には格納されません。mod_plsqlのファイル・システム・キャッシュを使用していても、メモリー・ディスクなどの機能がオペレーティング・システムでサポートされ、それを使用するようにシステムが構成されている場合(一部のUNIXプラットフォームはメモリー・ディスク・ベースの高速格納をサポートしています)、キャッシュ・コンテンツはメモリーに存在することがあります。

mod_plsqlがファイル・システム・キャッシュを使用するように構成されている場合は、この項の情報に従ってPL/SQLベースのWebアプリケーションのパフォーマンスを改善できます。たとえば、Oracle Portalではファイル・システム・キャッシュを使用しています。そのため、ファイル・システム・キャッシュが適切にチューニングされれば、Oracle Portalのパフォーマンスは向上します。

表4-3に、mod_plsqlに対して設定できるキャッシュ関連のパラメータを示します。これらのパラメータをcache.confファイルに設定します。このファイルは、UNIXではORACLE_INSTANCE/config/OHS/ohs1/mod_plsql/dads.confディレクトリに、WindowsではORACLE_INSTANCE\config\OHS\ohs1\mod_plsql\dads.confディレクトリにあります。

注意:
confディレクトリのcache.READMEファイルには、各パラメータの詳細な説明や、パラメータ値の設定方法を示す例が含まれています。

表4-3 mod_plsql cache.confの構成パラメータの概要

パラメータ

説明

PlsqlCacheCleanupTime

キャッシュ・クリーンアップ・ルーチンの実行間隔を設定します。

デフォルト: Everyday 23:00(現地時間の毎日午後11時にクリーンアップ・ルーチンを実行)

関連項目: 4.4.5項「キャッシュ・クリーンアップの構成」

PlsqlCacheDirectory

mod_plsqlのキャッシュを保持するディレクトリを定義します。

デフォルト:

UNIXシステムでは、エラー・ログのデフォルト・ディレクトリは${ORACLE_INSTANCE}/${COMPONENT_TYPE}/${COMPONENT_NAME}です。

Windowsシステムでは、エラー・ログのデフォルト・ディレクトリは${ORACLE_INSTANCE}\${COMPONENT_TYPE}\${COMPONENT_NAME}です。

関連項目: 4.4.3項「より高速なファイル・システムに存在するためのファイル・システム・キャッシュの構成」

PlsqlCacheEnable

ファイル・システム・キャッシュを使用できるようにします。

デフォルト: On

関連項目: 4.4.2項「ファイル・システム・キャッシュの有効化」

PlsqlCacheMaxAge

キャッシュ・コンテンツのエージングを日単位で制御します。

デフォルト: 30(日)

関連項目: 4.4.4.2項「PlsqlCacheMaxAgeによるキャッシュのエージング日数の設定」

PlsqlCacheMaxSize

キャッシュに格納される個々のファイルの最大サイズをバイト単位で設定します。

デフォルト: 1048576(1MB)

関連項目: 4.4.4.3項「PlsqlCacheMaxSizeによるキャッシュ・ファイルの最大ファイル・サイズの設定」

PlsqlCacheTotalSize

キャッシュの合計サイズを制限します。この値はバイト単位で指定します。

デフォルト: 20971520(20MB)

関連項目: 4.4.4.1項「PlsqlCacheTotalSizeによる合計キャッシュ・サイズの設定」

4.4.2 ファイル・システム・キャッシュの有効化

cache.confのPlsqlCacheEnableパラメータにより、mod_plsqlキャッシングが使用できるようになります。パフォーマンスを最大化するには、PlsqlCacheEnableパラメータの値をOnに設定して有効にします。

注意:
PL/SQLキャッシングをサポートするアプリケーション(Oracle Portalなど)でのみ、PlsqlCacheEnableをOnに設定するメリットがあります。

4.4.3 より高速なファイル・システムに存在するためのファイル・システム・キャッシュの構成

この項では、別のディスク上にあるようにファイル・システム・キャッシュを構成する方法について説明します。ファイル・システム・キャッシュを使用し、より高速な別のディスク上にキャッシュを格納すると、Oracle Portalや一般的なPL/SQLベースのWebアプリケーションなど、ファイル・システム・キャッシュを使用するすべてのタイプのWebアプリケーションについて、パフォーマンスは向上します。

ファイル・システム・キャッシュを構成する際、キャッシュを別の物理ディスクまたはメモリー・ディスクのいずれかに設定できます。

ファイル・システム・キャッシュを別のディスク上に設定するには、次のようにします。

1. キャッシュのファイル・システムは次の場所にあるとします。
UNIXの場合: /u01/cache

Windowsの場合: E:\cache

2. 次のファイルを更新します。
UNIXの場合: ORACLE_INSTANCE/config/OHS/ohs1/mod_plsql/cache.conf

Windowsの場合: ORACLE_INSTANCE\config\OHS\ohs1\mod_plsql\cache.conf

3. キャッシュ・パラメータのPlsqlCacheDirectoryを次のように変更します。
UNIXの場合: PlsqlCacheDirectory /u01/cache

Windowsの場合: PlsqlCacheDirectory E:\cache

4.4.4 ファイル・システム・キャッシュのサイズ変更

この項の内容は、次のとおりです。

- PlsqlCacheTotalSizeによる合計キャッシュ・サイズの設定

- PlsqlCacheMaxAgeによるキャッシュのエージング日数の設定

- PlsqlCacheMaxSizeによるキャッシュ・ファイルの最大ファイル・サイズの設定

4.4.4.1 PlsqlCacheTotalSizeによる合計キャッシュ・サイズの設定

デフォルトのインストールでは、mod_plsqlのファイル・システム・キャッシュ・サイズは2097152バイト(20MB)に設定されます。PL/SQLアプリケーションがOWA_CACHEパッケージを使用しない場合、またはパッケージを使用して少量のコンテンツをキャッシュする場合は、デフォルト設定で十分です。PL/SQLアプリケーションが大量のコンテンツをmod_plsqlのファイル・システム・キャッシュにキャッシュする場合、より高い値の指定を検討する必要があります。

キャッシュ・サイズを制御するには、cache.confファイルにPlsqlCacheTotalSizeパラメータを設定します。UNIXシステムでは、このファイルはORACLE_INSTANCE/config/OHS/ohs1/mod_plsqlディレクトリにあります。Windowsシステムでは、このファイルはORACLE_HOME\config\OHS\ohs1\mod_plsqlにあります。

高いキャッシュ・ヒット率を達成するのに十分なキャッシュ・サイズを設定する必要があります。頻繁にアクセスされるコンテンツがキャッシュされた状態を維持するのに十分な大きさのキャッシュ・サイズを設定するようにしてください。また、キャッシュ・サイズが大きくなりすぎないように、ディスク領域の量を制限することも重要です。キャッシュ・サイズを適切にチューニングすると、頻繁にアクセスされるコンテンツすべてを保持するために十分なキャッシュを提供する一方で、非常に大きなキャッシュの検索は非効率であることから、キャッシュ・サイズが大きくなりすぎるのを防ぐこともできます。

PlsqlCacheTotalSizeの値はバイト数で指定します。1MBは1048576バイトです。この設定は、割り当てられるキャッシュ量に対する弱い制限です。場合によっては、次のクリーンアップ操作までに、キャッシュ・サイズがこの制限を超えて大きくなることがあります。そのため、キャッシュ・サイズに対する強い制限は、使用する物理ハード・ディスク・サイズとなります。この制限に達すると、領域が使用可能になるまで、キャッシュ・コンテンツをディスクに書き出すことができません。

注意:
PlsqlCacheTotalSizeに使用できる最大値は、4294967296バイト(4GB)です。

適度なキャッシュ・サイズを決定するには、次のようにします。

1. httpd.confのLogLevelをinfoレベルに設定してmod_plsqlパフォーマンス・ロギングをオンにし、mod_plsqlロギングを使用できるようにします。

2. 日次ベースでerror_logを監視します。UNIXシステムでは、エラー・ログのデフォルト・ディレクトリはORACLE_HOME/ohs/mod_plsql/logです。Windowsシステムでは、デフォルト・ディレクトリはORACLE_HOME\ohs\mod_plsql\logです。

mod_plsql error_logエントリは、次のような形式です。

[info] mod_plsql: cachecleanup deleted=2571 max_age=96,2178852b  kept=1042,25585368b time=128s limit=25600000b

意味は次のとおりです。

deletedは、クリーンアップ・プロセスで削除されたキャッシュ・ファイルの数です。

max_ageは、一定期間使用されていなかったために削除されたキャッシュ・ファイルの数および合計サイズです。

keptは、クリーンアップ・プロセス後に保持されたキャッシュ・ファイルの数および合計サイズです。

timeは、クリーンアップの実行にかかった時間です。

limitは、合計キャッシュ・サイズです。これは、PlsqlCacheTotalSize設定の値です。

エラー・ログのエントリは次のように解析します。

- 保持されたファイルの数と比較して多数のファイルが削除されている場合、これはキャッシュ・サイズが小さすぎることを明らかに示しています。おそらくキャッシュ・サイズを増やす必要があります。

- 保持されたファイルの数と比較して少数のファイルが削除されている場合、これはキャッシュ・サイズがおそらく大きすぎることを示しています。十分なディスク領域がある場合、そのままにしておくか、またはキャッシュ・サイズを減らしてディスク領域を解放できます。

4.4.4.2 PlsqlCacheMaxAgeによるキャッシュのエージング日数の設定

PlsqlCacheMaxAgeパラメータを使用すると、キャッシュ・コンテンツの古さを制御できます。パラメータの値は日数単位で指定します。このパラメータのデフォルト値は30(日)です。これは、キャッシュ・コンテンツが30日以内であれば、キャッシュに保存されることを意味します。30日を過ぎると、コンテンツはクリーンアップ・プロセス時に削除対象とみなされます。

mod_plsql error_logのmax_age情報には、キャッシュ・ファイルのエージング情報が示されます。サイトが非常に動的なサイトである場合、この設定をより小さい値に構成します。通常、古いキャッシュ・コンテンツは再利用されないので、小さい値にしてもキャッシュ・ヒット率に影響を及ぼすことがないためです。サイトに多くの静的ページが含まれる場合、PlsqlCacheMaxAgeの値を増やし、クリーンアップ・プロセスでキャッシュ・コンテンツが故意に削除されないようにします。

4.4.4.3 PlsqlCacheMaxSizeによるキャッシュ・ファイルの最大ファイル・サイズの設定

PlsqlCacheMaxSizeパラメータを使用すると、キャッシュに格納される個々のファイルの最大サイズを指定できます。このパラメータを使用することで、1つのキャッシュ・ファイルでキャッシュ全体がいっぱいになる状態を回避できます。

このパラメータのデフォルト値は1048576(バイト)です。一般に、このパラメータは、合計キャッシュ・サイズの約1から3%の値に設定します。

注意:
PlsqlCacheMaxSizeに使用できる最大値は、4294967296バイト(4GB)です。

4.4.5 キャッシュ・クリーンアップの構成

キャッシュ・クリーンアップ・パラメータにより、ファイル・システム・キャッシュを調査し、必要に応じてクリーンアップする頻度が決まります。キャッシュ・クリーンアップ・パラメータのPlsqlCacheCleanupTimeはcache.confファイルに指定されています。頻度は、毎日、毎週、毎月に設定できます。毎週のクリーンアップを指定する場合、曜日と時刻を指定できます。

mod_plsqlのPlsqlCacheCleanupTimeのデフォルト設定は、現地時間の毎日午後11時です。そのため、デフォルトでは、毎晩午後11時にクリーンアップ・ルーチンが実行されます。頻度を毎月に選択した場合、クリーンアップは毎月第1土曜日に行われます。

クリーンアップの頻度が高すぎるとキャッシュ・ヒット率が低くなり、クリーンアップの頻度が低すぎるとキャッシュのディスク使用量が過多になるため、このパラメータを適切に設定することが重要です。

クリーンアップ・アクティビティは、mod_plsql error_logのエントリを使用して監視します。エントリを分析して、クリーンアップ・パラメータのPlsqlCacheCleanupTimeをチューニングします。

[info] mod_plsql: cachecleanup deleted=2571 max_age=96,2178852b  kept=1042,25585368b time=128s limit=25600000b

次の事柄に注意してください。

- クリーンアップ時間の値が大きい場合、クリーンアップの頻度の設定が低すぎることを示している可能性があります。クリーンアップ操作で、多数のキャッシュ・ファイルの調査または削除に時間がかかることをログが示している場合は、クリーンアップの頻度を高くすることで、クリーンアップ操作にかかる時間を減らすことができます。

- クリーンアップ操作時に古さが理由で多数のファイルが削除されている場合、クリーンアップの頻度が低すぎることを示しています。この場合、頻度を高くして、クリーンアップで古いキャッシュ・コンテンツをより頻繁に削除できるようにします。

4.5 Oracle HTTP Serverのディレクティブ

Oracle HTTP ServerでのPL/SQLのパフォーマンスを向上させるには、使用している構成に対してOracle HTTP Serverのディレクティブを適切にチューニングする必要があります。

関連項目:

- 『Oracle Fusion Middleware Performance Guide』のOracle HTTP Serverのディレクティブの構成に関する項

- 『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』の第5章「サーバー・プロセスの管理と監視」および第6章「接続の管理」

A よくある質問

- mod_plsqlとはなんですか。

- PL/SQL Web Toolkitとはなんですか。

- OWAパッケージのリリースを確認するにはどうすればよいですか。

- OWAパッケージをインストールするにはどうすればよいですか。

- OWAパッケージをアンインストールするにはどうすればよいですか。

- データベースに重複してインストールされているOWAパッケージを検出してクリーンアップするには、どうすればよいですか。

- mod_plsqlを介してPL/SQLプロシージャにアクセス中にHTTPエラー・コードが戻されます。

- すべての独自PL/SQLプロシージャで、Netscapeでは「ドキュメントにデータが含まれていません」というエラー、Internet Explorerでは空白ページが戻されます。

- パフォーマンスの高いPL/SQLプロシージャがありますが、mod_plsqlを介した一部のHTTPリクエストに15秒以上かかることがあります。

- mod_plsqlを使用して独自データベース上でアプリケーションを実行することはできますか。

- mod_plsql用のDADを作成するにはどうすればよいですか。

- mod_plsqlではどのような認証モードを使用できますか。

- mod_plsqlクリーンアップ・スレッドとはなんですか。

- mod_plsqlには、どのような種類のデータベース接続プーリング機能がありますか。

- mod_plsqlではどのようにしてデータベース・セッションがクリーンアップされますか。

- プールされたデータベース接続がmod_plsqlに存在するときに、データベースを再起動するとどうなりますか。

- mod_plsqlではファイル・システム内でキャッシュされたコンテンツがどのようにクリーンアップされますか。

- URLに接頭辞/plsを付けずにmod_plsqlを起動できますか。

- PL/SQLとmod_plsqlのパフォーマンスを改善するにはどうすればよいですか。

- mod_plsqlではどのような種類のロギング機能を使用できますか。

- mod_plsqlには高可用性についてどのような考慮事項がありますか。

- データベースがファイアウォールで分離されている場合、mod_plsqlではどのような考慮事項がありますか。

- PL/SQLアプリケーションに対して異なるホスト名、ポートまたはrequest_protocolをアサートするには、どうすればよいですか。

- 特定のパターンを持つプロシージャ名へのアクセスを無効化するにはどうすればよいですか。

- ファイルORACLE_HOME/Apache/Apache/conf/error_logにエラー「HTTP-503 ORA-12154」があります。これは何を意味しますか。

- mod_plsqlの起動時に、/DAD/package.procedure()または/DAD/package.procedure(123)という形式のURLが機能しないのはなぜですか。

mod_plsqlとはなんですか。

mod_plsqlは、SQL*Net接続を通じてブラウザ・リクエストをデータベース・ストアド・プロシージャ・コールにマッピングすることで、データベースと通信を行うOracle HTTP Serverのプラグインです。通常、仮想パスの/plsで示されます。mod_plsqlゲートウェイは、Web上でのPL/SQLベースのアプリケーションの構築と運用をサポートします。PL/SQLストアド・プロシージャはデータベース表からデータを取得し、Webブラウザで表示する書式付きデータとHTMLコードが含まれたHTTPレスポンスを生成できます。詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

PL/SQL Web Toolkitとはなんですか。

PL/SQL Web Toolkitを使用すると、Webアプリケーションを、Oracleデータベース・サーバーに格納されるPL/SQLプロシージャとして開発できます。このツールキット内のパッケージにより定義されるプロシージャ、ファンクションおよびデータ型を、独自のストアド・プロシージャで使用できます。詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

OWAパッケージのリリースを確認するにはどうすればよいですか。

1. SQL*Plusを使用し、任意のユーザーとしてデータベースに接続します。

2. 次のコマンドを実行します。

select owa_util.get_version from dual;

OWAパッケージのリリースが表示されます。たとえば、10.1.2.0.4。

この問合せに失敗した場合は、OWAパッケージのリリースが古すぎるためにバージョニング機能がありません。新しいリリースにアップグレードすることをお薦めします。

OWAパッケージをインストールするにはどうすればよいですか。

詳細は、1.2項「必須パッケージのインストール」を参照してください。

OWAパッケージをアンインストールするにはどうすればよいですか。

次のタスクを実行すると、OWAパッケージをアンインストールできます。

1. OWAパッケージのインストール元ディレクトリに移動します。たとえば、次のようになります。

cd ORACLE_HOME\ohs\mod_plsql

2. SQL*Plusを使用し、OWAパッケージの所有者として接続します。OWAパッケージの旧バージョンがある場合を除き、ここではSYSユーザーを使用する必要があります。

3. owadins.sqlスクリプトを起動してOWAパッケージをアンインストールします。

データベースに重複してインストールされているOWAパッケージを検出してクリーンアップするには、どうすればよいですか。

次のSQL問合せを使用すると、OWAパッケージの位置を判断できます。

SELECT OWNER, OBJECT_TYPE
FROM   DBA_OBJECTS
WHERE  OBJECT_NAME = 'OWA'

次の結果が表示されます。

SQL>

1  SELECT OWNER, OBJECT_TYPE
2  FROM DBA_OBJECTS
3* WHERE OBJECT_NAME = 'OWA'

OWNER  OBJECT_TYPE
-----  -----------
SYS    PACKAGE
SYS    PACKAGE BODY
PUBLIC SYNONYM

このSQL問合せよりも多数の行が表示される場合は、他のスキーマに古いOWAパッケージが存在し、それがmod_plsqlユーザーにとって問題になっている可能性があることを意味します。この場合は、すべてのバージョンのOWAパッケージをデータベースからアンインストールし、製品とともに出荷されているOWAパッケージを再インストールします。

mod_plsqlを介してPL/SQLプロシージャにアクセス中にHTTPエラー・コードが戻されます。

mod_plsqlでは、Oracle HTTP ServerファイルのORACLE_HOME\ohs\mod_plsql\logsに詳細なエラー・メッセージが記録されます。このファイルを調べて問題を把握してください。mod_plsqlのロギングの詳細は、「mod_plsqlではどのような種類のロギング機能を使用できますか。」を参照してください。

すべての独自PL/SQLプロシージャで、Netscapeでは「ドキュメントにデータが含まれていません」というエラー、Internet Explorerでは空白ページが戻されます。

データベースにOWAパッケージが重複してインストールされていると、この問題が発生する場合があります。詳細は、「データベースに重複してインストールされているOWAパッケージを検出してクリーン・アップするには、どうすればよいですか?」を 参照してください。

パフォーマンスの高いPL/SQLプロシージャがありますが、mod_plsqlを介した一部のHTTPリクエストに15秒以上かかることがあります。

この問題の最も一般的な原因は、中間層とバックエンド・データベースのキャラクタ・セットが一致せず、Oracle HTTP ServerでHTTP KeepAliveが有効化されていることです。設定にこの種の誤りがあると、無効なContent-Lengthがブラウザに送信され、ブラウザはKeepAliveTimeout間隔によってストリームがクローズされた場合にのみレスポンス・ストリームの終わりを検出します。この問題を解決するには、DADとデータベースのPlsqlNLSLanguageパラメータが一致するようにします。

これが問題の原因ではない場合、PL/SQLアプリケーションにパフォーマンス問題があると考えられます。これは次の方法で確認できます。

- mod_plsqlのパフォーマンス・ロギングを有効にします。詳細は、「mod_plsqlではどのような種類のロギング機能を使用できますか。」を参照してください。

- パフォーマンスの問題があるURLを数回実行します。

- error_logを見て、dbProcTimeにレポートされた時間を確認します。この時間は、データベースから見たターゲットPL/SQLプロシージャにかかった時間を表します。この値が高い場合は、標準のデータベース・プロファイリング方法を使用して、PL/SQLアプリケーションをデバッグする必要があります。

mod_plsqlを使用して独自データベース上でアプリケーションを実行することはできますか。

はい。ただし、アプリケーションを実行する前に、データベースにOWAパッケージをインストールする必要があります。1.2項「必須パッケージのインストール」を参照してください。

mod_plsql用のDADを作成するにはどうすればよいですか。

『Oracle Fusion Middleware Oracle HTTP Server管理者ガイド』の「mod_plsql」を参照してください。

mod_plsqlではどのような認証モードを使用できますか。

第2章「mod_plsqlを使用したアプリケーション・データベース・アクセスの保護」を参照してください。

mod_plsqlクリーンアップ・スレッドとはなんですか。

mod_plsqlは、各httpdプロセスでスレッドを起動します。このスレッドのジョブは、アイドル状態のデータベース・セッションとファイル・システムのキャッシュをクリーンアップすることです。このスレッドをクリーンアップ・スレッドと呼びます。

mod_plsqlには、どのような種類のデータベース接続プーリング機能がありますか。

第4章「PL/SQLのパフォーマンスの最適化」を参照してください。

mod_plsqlではどのようにしてデータベース・セッションがクリーンアップされますか。

mod_plsqlでは、PlsqlIdleSessionCleanupIntervalの構成設定に基づいて、使用されていないデータベース・セッションがクリーンアップされます。この他、プールされたデータベース・セッションから提供されるリクエストの数は、設定ディレクティブPlsqlMaxRequestsPerSessionにより制御されます。HTTPDプロセスがシャットダウンされると、データベース・セッションがクローズされます。

プールされたデータベース接続がmod_plsqlに存在するときに、データベースを再起動するとどうなりますか。

詳細は、3.11.3項「接続プールでの停止中のデータベース接続の検出」を参照してください。

mod_plsqlではファイル・システム内でキャッシュされたコンテンツがどのようにクリーンアップされますか。

クリーンアップ・スレッドは、PlsqlCacheCleanupTimeの設定に基づいてファイル・システム・キャッシュをスキャンします。デフォルトのクリーンアップ時刻は、現地時間で毎日午後11時です。

URLに接頭辞/plsを付けずにmod_plsqlを起動できますか。

はい。mod_plsqlはOracle HTTP ServerのLocationディレクティブを使用するため、mod_plsqlで処理されるように任意の仮想パスを設定できます。

PL/SQLとmod_plsqlのパフォーマンスを改善するにはどうすればよいですか。

第4章「PL/SQLのパフォーマンスの最適化」を参照してください。

mod_plsqlではどのような種類のロギング機能を使用できますか。

- mod_plsqlでは、デフォルトでOracle HTTP Server error_logファイルのORACLE_HOME/ohs/mod_plsql/logsにアラート、警告またはエラーが記録されます。mod_plsqlで記録される情報の量は、Oracle HTTP Serverのhttpd.confのLogLevelパラメータ設定で制御されます。デフォルトでは、このパラメータはwarnに設定されます。

- また、次の手順に従って、mod_plsqlのパフォーマンス・ロギングをリクエストごとに有効化することもできます。

1. ORACLE_INSTANCE\config\OHS\ohs1\httpd.confを編集し、LogLevelをinfo(デフォルトはwarn)に設定します。

2. 次のコマンドを使用してOracle HTTP Serverを再起動します。

ORACLE_INSTANCE\bin\opmnctl restartproc type=ohs

3. mod_plsqlに対してなんらかのURLを発行し、ファイルORACLE_INSTANCE\diagnostics\logs\OHS\ohs1\error_logが次のようなエントリで始まることを確認します。

[Tue Apr 01 14:54:49 2003] [info] mod_plsql: [perf] 130.35.92.145 /pls/app/htp.p status=200 user=scott reqTime=21ms connSU=(null),
0ms connRO=(null),0ms connNSSO=HIT,1ms procTime=17ms sessionTidyTime=0ms cache=(null) cookie=(null),
0ms pageCalls=0,0ms bytes=5 describe=No,0ms streamTime=0ms pid=175 sessFile=(null) userFile=834\0855 sysFile=470\5949 cacheLevel=(null)
cacheTime=0ms dbProcTime=15ms id=1049237685:130.35.92.145:373:1 spid=(null)
qs=(null) requestTrace=(null) cookieLen=0 cookieValue=(null)
reqUserTime=16ms assertUser=(null) subid=(null) authLevel=(null) oraError=0

- 最後に、mod_plsqlでデバッグ・ロギングを有効化できます。これは最上位のロギング・レベルであり、アクティブ・サイトの場合はお薦めしません。

注意:

このロギング・モードは、Oracleサポート・サービスから要請された場合にのみ有効化してください。

このモードでは、デバッグ・メッセージがOracle HTTP Serverのerror_logファイルに記録され、さらにmod_plsql固有のログがORACLE_HOME\ohs\mod_plsql\logsに作成されます。ログの場所は、ORACLE_HOME\ohs\conf\moduleconf\plsql.conf内でPlsqlLogDirectoryディレクティブを使用して設定可能です。デバッグ・レベルのロギングを有効化する手順は、次のとおりです。

1. ORACLE_HOME\ohs\conf\moduleconf\plsql.confを編集し、PlsqlLogEnableをOn(デフォルトはOff)に設定します。

2. 次のコマンドを使用してOracle HTTP Serverを再起動します。

ORACLE_INSTANCE\bin\opmnctl restartproc type=ohs

mod_plsqlには高可用性についてどのような考慮事項がありますか。

高可用性のために、mod_plsqlベースのアプリケーションでは次のことを認識する必要があります。

- mod_plsqlの構成パラメータPlsqlDatabaseConnectStringには、Oracle Internet DirectoryのLDAP検索を介して名前解決が行われるように、接続文字列形式のNetServiceNameFormatを使用する必要があります。これにより、データベースのhost:port:service_name情報を中央のリポジトリで設定でき、必要に応じたRACノードの追加または削除が容易になります。

- mod_plsqlでは、停止中のデータベース接続が自動的に検出されます。詳細は、3.11.3項「接続プールでの停止中のデータベース接続の検出」を参照してください。

データベースがファイアウォールで分離されている場合、mod_plsqlではどのような考慮事項がありますか。

mod_plsqlを実行する中間層とバックエンド・データベースの間にファイアウォールが存在する場合は、mod_plsqlでアイドル・セッションのクリーンアップ間隔を、ファイアウォールでの間隔よりも短く設定する必要があります。これにより、mod_plsqlが確立した接続をファイアウォールがクローズすることはなくなります。

注意:
mod_plsqlのアイドル・セッション・クリーンアップ間隔は、ORACLE_HOME\ohs\conf\moduleconf\plsql.conf内のパラメータPlsqlIdleSessionCleanupIntervalを使用して設定できます。デフォルト値は15分です。

PL/SQLアプリケーションに対して異なるホスト名、ポートまたはrequest_protocolをアサートするには、どうすればよいですか。

- Oracle HTTP Serverインスタンスの手前にWeb Cacheまたはロード・バランシング・ルーターが存在する場合は、サイトのホスト名とポートをWeb CacheまたはLBRのホスト名およびポートとしてアサートする必要があります。このような場合は、Oracle HTTP Server設定ディレクティブServerNameおよびPortを使用してアサートすることをお薦めします。なんらかの理由でホスト名とポートをOracle HTTP Serverレベルでアサートしない場合は、mod_plsql設定ディレクティブPlsqlCGIEnvironmentListを使用して、mod_plsqlで実行中のPL/SQLアプリケーションに対してのみ異なるホスト名とポートをアサートできます。たとえば、次のようになります。

- PlsqlCGIEnvironmentList SERVER_NAME=lbr.us.oracle.com
かわりにOracle HTTP Serverのhttpd.conf内のServerNameディレクティブを使用することを考慮してください。

- PlsqlCGIEnvironmentList SERVER_PORT=9999
かわりにOracle HTTP Serverのhttpd.conf内のPortディレクティブを使用することを考慮してください。

- PlsqlCGIEnvironmentList HTTP_HOST=myservername.us.oracle.com:9999
SERVER_NAME:SERVER_PORTの組合せです。

- 同様に、サイトが外部からはSSLとしてアクセスされるが、内部的には非SSLモードで(間にSSLアクセラレータを使用して)稼働する場合は、PL/SQLアプリケーションで非SSLリンクのかわりにSSLリンクを生成できるように、REQUEST_PROTOCOLをHTTPSとしてアサートできます。たとえば、次のようになります。

PlsqlCGIEnvironmentList  REQUEST_PROTOCOL=https

特定のパターンを持つプロシージャ名へのアクセスを無効化するにはどうすればよいですか。

詳細は、2.1.2項「mod_plsqlでのPlsqlExclusionListディレクティブへのルールの追加」を参照してください。

ファイルORACLE_HOME/Apache/Apache/conf/error_logにエラー「HTTP-503 ORA-12154」があります。これは何を意味しますか。

このエラーは、mod_plsqlからデータベースに接続できないことを意味します。

次のことを確認してください。

1. データベースが稼働中であること。

2. DADに指定されているユーザー名およびパスワード情報が正しいこと。

3. 中間層が、DADのPlsqlDatabaseConnectStringパラメータを使用してデータベースに接続できること。

ほとんどの場合、この問題が発生するのは、SQL*NetがORACLE_HOME/network/adminにある設定情報を使用して接続文字列パラメータを解決できないためです。

- TNSFormatまたはNetServiceNameFormatを使用して設定したエントリの場合は、tnsping dad_connect_stringを使用して接続文字列情報を確認します。たとえば、次のようになります。

tnsping "cn=iasdb,cn=oraclecontext"

または

tnsping iasdb.us.oracle.com

- SIDFormatおよびServiceNameFormatを使用して設定したエントリの場合は、データベース・リスナーのhostname、portおよびSID/service_name情報が一致していることを確認します。その後、SQL*PlusでDADにあるユーザー名、パスワードおよび接続文字列を使用してデータベースに接続できることを確認します。

接続できない場合、トラブルシューティング情報についてはOracle SQL*Netのマニュアルを参照してください。

注意:
DADのデフォルトの接続文字列パラメータは、Oracle Internet DirectoryでLDAP検索を介して解決されるように設定されます。ldap.oraを変更した場合は、その変更にmod_plsqlからアクセスできるようにOracle HTTP Serverを再起動する必要があります。

mod_plsqlの起動時に、/DAD/package.procedure()または/DAD/package.procedure(123)という形式のURLが機能しないのはなぜですか。

mod_plsqlでは次の形式のURLをサポートしていません。

- /DAD/package.procedure()

- /DAD/package.procedure(123)

たとえば、次のようになります。

http://www.acme.com:9000/pls/mydad/mypackage.myproc()またはhttp://www.acme.com:9000/pls/mydad/mypackage.myproc(123)

サポートされているURLの形式の詳細は、3.3項「mod_plsqlの実行」を参照してください。

索引

A  B  C  D  E  F  G  H  K  L  M  O  P  R  S  T  U  V  W

記号

!記号

定義, 3.3

柔軟なパラメータの受渡し, 3.6.2

数字

2パラメータ

柔軟なパラメータの受渡し, 3.6.2.1

4パラメータ

柔軟なパラメータの受渡し, 3.6.2.2

A

配列, 3.6.1

B

バイナリ・ラージ・オブジェクト, 3.7, 3.7.7

BLOB, 3.7, 3.7.7

ドキュメント表の定義, 3.7.1

C

キャッシング

期限方式, 3.10.2

owa_cacheパッケージ, 3.10.3

システム・レベル, 3.10.3

ユーザー・レベル, 3.10.3, 3.10.3

検証方式, 3.10.1

CGI

環境変数, 3.9.1

クライアント・リクエスト, 3.1 クラスタ構成, 3.11.3 構成

mod_plsql, 1.5

DADの構成, 1.5 mod_plsqlの構成, 1.5 CONTENT列, 3.7.1.1 CONTENT_TYPE列, 3.7.1.2 Cookieの制限, 3.12 作成

DAD, 1.4

D

DAD, 3

作成,1.4

定義, 3.2

DAD情報の保持, 1.5

DADの構成, 1.5 DAD_CHARSET列, 3.7.1.4 データベース・アクセス記述子, 3 データベース・アクセス記述子(DAD)

DADを参照, 1.5

データベース接続プール, 3.11.3 停止中のデータベース, 3.11.3 停止中のデータベース接続, 3.11.3 ダイレクト・アクセスURL, 3.8 ドキュメント・アクセス・パス, 3.7.3.2 ドキュメント表の定義, 3.7.1

以前のスタイル, 3.7.2

document_path, 3.7.3.2 document_proc, 3.7.3.3 ダウンロード, 3.7 DTD, 3.7.1

以前のスタイル, 3.7.2

E

Entity Tagキャッシング方法, 3.10.1.2

環境変数

CGI, 3.9

期限キャッシング方式, 3.10.2

F

ファイルのアップロード, 3.7, 3.7.4

属性, 3.7.5

複数のファイル, 3.7.6

4パラメータ

柔軟なパラメータの受渡し, 3.6.2.2

G

GETメソッド, 3.3

グローバリゼーション・サポート, 3.9.2

設定, 3.9.2

H

HEADメソッド, 3.3

HTTP HEADリクエスト, 3.3

HTTPサーバー

httpdプロセス, 3.11.1

httpd

HTTP Serverプロセス, 3.11.1

httpd.conf, 1.6

ディレクティブ

MaxSpareServers, 4.3.4

MinSpareServers, 4.3.4

StartServers, 4.3.4

K

KeepAlive httpd.confディレクティブ, 4.5

L

言語設定, 3.9.2

LAST_UPDATED列, 3.7.1.3

ログ

mod_plsql, 1.6

LONG RAW

ドキュメント表の定義, 3.7.1

M

MIMEタイプ, 3.7.5

mod_expires, 4.5

mod_plsql

構成, 1.5

実行, 3.3

mod_plsqlの構成, 1.5 mod_plsql接続プール, 3.11.3 mod_plsqlサービス

DAD, 1.5

ログ, 1.6

監視および管理, 1.5

状態情報, 1.5

O

Oracle HTTP Server

ログ, 1.6

オーバーロード, 3.6.1, 3.6.1 owa_cacheパッケージ, 3.10.3 owa_util PL/SQL Web Toolkitパッケージ, 3.9 owaload.sql, 1.2

P

パラメータ

柔軟な, 3.6.2

大きな, 3.6.3

MaxClients, 3.11.2

MaxRequestsPerChild, 3.11.2

MaxSpareServers, 3.11.2

MinSpareServers, 3.11.2

オーバーロード, 3.6.1

受渡し, 3.6, 3.6.2

PlsqlConnectionTimeout, 3.11.3.2

PlsqlConnectionValidation, 3.11.3.1

PlsqlMaxRequestsPerSession, 3.11.2

パフォーマンス

チューニング

期限キャッシング, 3.10.2, 3.10.2

mod_expires, 4.5

システム・レベル・キャッシング, 3.10.3

検証キャッシング, 3.10.1.3

PL/SQLアプリケーション

DADの作成, 1.4

PL/SQL Web Toolkitのファンクション, 3.10.3 PlsqlConnectionTimeout, 3.11.3.2 PlsqlConnectionValidation, 3.11.3.1 PlsqlExclusionList, 2.1.2 PlsqlIdleSessionCleanupInterval, 3.11.2 PlsqlNLSLanguage, 3.9.2 POSTメソッド, 3.3

R

RAC, 3.11.3

RACクラスタ, 3.11.3

Real Application Cluster, 3.11.3

request_charset, 3.9.2.1

REQUEST_IANA_CHARSET, 3.9.2.2

制限, 3.12

S

設定

グローバリゼーション・サポート, 3.9.2

タイムアウトの指定, 3.11.3.2 システム・レベル・キャッシング, 3.10.3

T

タイムアウト, 3.11.3.2

トランザクション・モデル, 3.4

チューニング

期限キャッシング方式, 3.10.2

システム・レベル・キャッシング, 3.10.3

検証キャッシング, 3.10.1.3

2パラメータ

柔軟なパラメータの受渡し, 3.6.2.1

U

アップロード, 3.7

URLの形式, A

ユーザー・レベル・キャッシング, 3.10.3

V

検証キャッシング

mod_plsql, 3.10.1.3

方式, 3.10.1

W

Web Toolkit, 3.10.3

Copyright © 1996, 2011, Oracle and/or its affiliates. All rights reserved.