| Oracle® Fusion Middleware Oracle Complex Event Processing開発者ガイド 11gリリース1 (11.1.1.6.2) for Eclipse B61654-04 |
|
![]() 前 |
![]() 次 |
この章では、Oracle Complex Event Processing (Oracle CEP)イベント処理ネットワーク用にOracle Continuous Query Language (CQL)プロセッサを構成する方法について説明します。これには、プロセッサのデータ・ソースの構成およびパフォーマンスの最適化に関する情報も含まれます。
|
注意: イベント処理言語(EPL)は、Oracle CEP 11gリリース1 (11.1.1)ではOracle CQLによって置き換えられます。Oracle CEPは、EPLとの下位互換性をサポートします。詳細は、第11章「EPLプロセッサの構成」を参照してください。 |
Oracle CEPアプリケーションには、1つ以上の複雑なイベント・プロセッサ、もしくはプロセッサが含まれています。各プロセッサは1つまたは複数のアダプタからのイベントを入力として受け取ります。これらのアダプタでは、ソースから連続的なデータ・ストリームを送信するデータ・フィードにリスニングします。金融データ・フィードやOracle CEPロード・ジェネレータなど、任意のソースを使用できます。
Oracle CQLプロセッサの主な機能は、その関連付けられたOracle CQL (Oracle Continuous Query Language)ルールであり、これらのルールは、プロセッサにリスニング・コンポーネントに渡すイベントのサブセットを持ちます。リスニングするコンポーネントには、他のプロセッサまたは通常はイベント処理ネットワークの最後を定義し、クライアント・アプリケーションへのパブリッシュなどイベントでなんらかの処理を実行するビジネス・オブジェクトPOJOを指定できます。Oracle CQLの詳細は、『Oracle Fusion Middleware Oracle Complex Event Processing CQL言語リファレンス』を参照してください。
アプリケーションの各Oracle CQLプロセッサに対して、コンポーネント構成ファイルでprocessor要素を作成する必要があります。このprocessor要素では、プロセッサのOracle CQLルールの初期セット、および任意のプロセッサ構成を指定します。
Oracle CQLプロセッサEPNアセンブリ・ファイルで、任意の追加Oracle CQLプロセッサの機能を構成できます。
コンポーネント構成ファイルprocessor要素のname要素は、EPNアセンブリ・ファイルprocessor要素のid属性と一致している必要があります。たとえば、例10-1に示すEPNアセンブリ・ファイルprocessor要素の場合、例10-2に示す対応するコンポーネント構成ファイルprocessor要素が指定されます。
例10-1 EPNアセンブリ・ファイルOracle CQLプロセッサID: proc
<wlevs:processor id="proc">
<wlevs:table-source ref="Stock" />
</wlevs:processor>
例10-2 コンポーネント構成ファイルOracle CQLプロセッサ名: proc
<processor>
<name>proc</name>
<rules>
<query id="q1"><![CDATA[
SELECT ExchangeStream.symbol, ExchangeStream.price, Stock.exchange
FROM ExchangeStream [Now], Stock
WHERE ExchangeStream.symbol = Stock.symbol
]]></query>
</rules>
</procesor>
processor要素は、次のいずれかの任意のコンポーネント構成ファイルに作成できます。
デフォルトのOracle CEPアプリケーションの構成ファイル(デフォルトでは、META-INF/wlevs/config.xml)。
個別の構成ファイル。
アプリケーションに1つ以上のプロセッサが含まれている場合は、デフォルトconfig.xmlファイルでプロセッサごとにprocessor要素を作成できます。また、プロセッサごとにMETA-INF/wlevsに個別のXMLファイルを作成するか、またはすべてのプロセッサの構成のみでなく、アプリケーション内のすべてのコンポーネント(アダプタ、プロセッサ、およびチャネル)が含まれる単一のXMLファイルをMETA-INF/wlevsに作成できます。開発環境に最も適した方法を選択します。
デフォルトでは、Oracle CEP IDE for Eclipseは1つのコンポーネント構成ファイルと1つのEPNアセンブリ・ファイルを作成します。Oracle CEP IDE for Eclipseを使用してOracle CQLプロセッサを作成する場合、デフォルトでプロセッサ要素がデフォルト・コンポーネント構成ファイルのMETA-INF/wlevs/config.xmlファイルに追加されます。Oracle CEP IDE for Eclipseを使用して、Oracle CQLプロセッサの作成時に新しい構成ファイルを作成するか、または既存の構成ファイルを使用するかを選択できます。
コンポーネント構成ファイルは、Oracle CEPアプリケーション・バンドルの一部としてデプロイされます。Oracle CEP Visualizer、wlevs.Adminユーティリティを使用するか、または適切なJMX Mbeanを直接操作して、後で実行時にこの構成を更新できます。
詳細は、次を参照してください:
『Oracle Fusion Middleware Oracle Complex Event Processing Visualizerユーザーズ・ガイド』
『Oracle Fusion Middleware Oracle Complex Event Processing管理者ガイド』のwlevs.Adminコマンドライン・リファレンスに関する項
『Oracle Fusion Middleware Oracle Complex Event Processing管理者ガイド』のOracle CEPのJMXの構成に関する項
Oracle CQLプロセッサ構成の詳細は、次の項を参照してください。
1つ以上の問合せを使用してOracle CQLプロセッサを構成する場合、デフォルトではすべての問合せの結果がダウンストリーム・チャネルに出力されます。
どの問合せの結果をダウンストリーム・チャネルに出力するかは、チャネルselector要素を使用してこのチャネルに結果を出力する問合せ名のリストをスペースで区切って指定することで制御できます。
アップストリーム・プロセッサに問合せを作成する前に、selectorでchannel要素を構成することもできます。この場合、selector内の名前と一致する問合せ名を指定する必要があります。
詳細は、9.1.5項「ダウンストリーム・チャネルに対する問合せ出力の制御: selector」を参照してください。
プロセッサは手動で構成するか、またはOracle CEP IDE for Eclipseを使用して構成できます。
プロセッサ・コンポーネント構成ファイルを記述する完全なXSDスキーマは、B.2項「コンポーネント構成スキーマwlevs_application_config.xsd」を参照してください。
Oracle CQLプロセッサ・コンポーネント構成ファイルおよびアセンブリ・ファイルの完全な例は、10.6項「Oracle CQLプロセッサ構成ファイルの例」を参照してください。
この節では、次のトピックについて説明します。
プロセッサを作成および編集する最も効率的かつ間違いの少ない方法は、Oracle CEP IDE for Eclipseを使用することです。オプションで、プロセッサは手動で作成および編集できます(10.2.2項「Oracle CQLプロセッサ・コンポーネント構成ファイルの手動による作成方法」を参照してください)。
Oracle CEP IDE for Eclipseを使用してOracle CQLプロセッサを構成するには:
Oracle CEP IDE for Eclipseを使用してプロセッサを作成します。
6.4.1.3項「プロセッサ・ノードの作成方法」を参照してください。
EPNエディタを使用してOracle CQLプロセッサを作成する場合、Oracle CEP IDE for Eclipseでは、デフォルト・コンポーネント構成ファイルまたは新しいコンポーネント構成ファイルの選択が求められます。詳細は、第6章「Oracle CEP IDE for Eclipseおよびイベント処理ネットワーク」を参照してください。
「プロセッサ」ノードを右クリックし、「構成のソースに移動」を選択します。
Oracle CEP IDE for Eclipseは、適切なコンポーネント構成ファイルを開きます。デフォルト・プロセッサ・コンポーネント構成は、例10-3に示されています。
デフォルト・プロセッサ・コンポーネント構成には、name要素およびrules要素が含まれます。
rules要素を使用して、このプロセッサが実行するOracle CQL文を含むように作成する子要素をグループ化します。子要素には、次のものが含まれます。
rule: ユーザー定義ウィンドウを登録または作成するOracle CQL文を含みます。rule要素id属性はウィンドウの名前と一致する必要があります。
view: Oracle CQL view文(Oracle CQLで副問合せに相当するもの)を含みます。view要素のid属性はビューの名前を定義します。
query: Oracle CQL select文を含みます。query要素のid属性は問合せの名前を定義します。
デフォルト・プロセッサ・コンポーネント構成には、id Queryのダミーquery要素が含まれます。
ダミーquery要素を、このプロセッサが実行するOracle CQL文を含むよう作成するrule、view、およびquery要素と置き換えます。
詳細は、『Oracle Fusion Middleware Oracle Complex Event Processing CQL言語リファレンス』のOracle CQL問合せ、ビュー、および結合の概要に関する項を参照してください。
「ファイル」>「保存」を選択します。
オプションで、アセンブリ・ファイルで追加のOracle CQLプロセッサの機能を構成します。
プロセッサ構成を作成、および編集する最も効率的かつ間違いの少ない方法は、Oracle CEP IDE for Eclipseを使用することではありますが(10.2.1項「Oracle CEP IDE for Eclipseを使用したOracle CQLプロセッサの構成方法」を参照)、プロセッサ構成ファイルを手動で作成および維持することもできます。
この項には、プロセッサ構成ファイルを手動で作成する主な手順が記述されています。簡略化のため、この手順ではすべてのプロセッサを1つのXMLファイルに構成することを想定しています。ただし、各プロセッサごとに個別のファイルを作成することもできます。
Oracle CQLプロセッサ・コンポーネント構成ファイルを手動で作成するには:
プロセッサが実行するOracle CQLルールのセットを設計します。これらのルールは、すべての受信イベントを選択する簡単なものから、次に示すように、時間、プロパティ値などを基にセットを制限するものまであります。
SELECT * FROM TradeStream [Now] WHERE price > 10000
Oracle CQLは、多くの点で、リレーショナル・データベース表の問合せに使用するStructure Query Language (SQL)と類似しますが、構文は多くの点で異なります。もう1つの大きな違いとしては、Oracle CQL問合せでは時間というディメンションも考慮し、プロセッサは静的なSQL問合せよりOracle CQLを継続的に実行します。
詳細は、『Oracle Fusion Middleware Oracle Complex Event Processing CQL言語リファレンス』のOracle CQL問合せ、ビュー、および結合の概要に関する項を参照してください。
アプリケーションの各プロセッサに対して、前の手順で設計したOracle CQLルールおよび他の任意の機能を含むプロセッサ構成XMLファイルを作成します。
このXMLファイルの名前は自分で決定しますが、その拡張は.xmlで終了することが必要です。
プロセッサ構成ファイルのルート要素はconfigで、ネームスペース定義は次の手順に示します。
アプリケーションの各プロセッサに対して、configのprocessor子要素を追加します。
各プロセッサをname子要素で一意に識別します。この名前は、アプリケーションのイベント処理ネットワークを定義するEPNアセンブリ・ファイルのwlevs:processor要素のid属性の値と同じである必要があります。これによって、Oracle CEPは、このプロセッサ構成はEPNアセンブリ・ファイルのどのプロセッサ・コンポーネントに適用されるかを理解します。詳細は、4.3項「EPNアセンブリ・ファイルの作成」を参照してください。
たとえば、アプリケーションに2つのプロセッサがある場合、構成ファイルは最初に以下のようになります。
<?xml version="1.0" encoding="UTF-8"?> <n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application"> <processor> <name>firstProcessor</name> ... </processor> <processor> <name>secondProcessor</name> ... </processor> </n1:config>
この例では、構成ファイルには、firstProcessorおよびsecondProcessorという2つのプロセッサが含まれています。これは、EPNアセンブリ・ファイルには、同じ識別子を持つ少なくとも2つのプロセッサ登録が含まれる必要があることを意味します。
<wlevs:processor id="firstProcessor" ...> ... </wlevs:processor> <wlevs:processor id="secondProcessor" ...> ... </wlevs:processor>
|
注意: XMLファイルの識別子と名前は大/小文字が区別されるため、EPNアセンブリ・ファイルでコンポーネントの識別子を参照するときは、必ず大/小文字を同一にします。 |
rules子要素を各processor要素に追加します。
rules要素を使用して、このプロセッサが実行するOracle CQL文を含むように作成する子要素をグループ化します。子要素には、次のものが含まれます。
rule: ユーザー定義ウィンドウを登録または作成するOracle CQL文を含みます。rule要素id属性はウィンドウの名前と一致する必要があります。
view: Oracle CQL view文(Oracle CQLで副問合せに相当するもの)を含みます。view要素のid属性はビューの名前を定義します。
query: Oracle CQL select文を含みます。query要素のid属性は問合せの名前を定義します。
viewおよびquery要素の必要なid属性を使用して、各ルールを一意に識別します。XML CDATAタイプを使用して、実際のOracle CQLルールを入力します。例:
<?xml version="1.0" encoding="UTF-8"?>
<n1:config
xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd"
xmlns:n1="http://www.bea.com/ns/wlevs/config/application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<processor>
<name>proc</name>
<rules>
<view id="lastEvents" schema="cusip bid srcId bidQty"><![CDATA[
select mod(price)
from filteredStream[partition by srcId, cusip rows 1]
]]></view>
<query id="q1"><![CDATA[
SELECT *
FROM lastEvents [Now]
WHERE price > 10000
]]></query>
</rules>
</processor>
</n1:config>]]></query>
ファイルを保存して閉じます。
オプションで、アセンブリ・ファイルで追加のOracle CQLプロセッサの機能を構成します。
表の各行がタプルとして表現されるイベント・ストリームとしてリレーショナル・データベース内の表にアクセスするよう、Oracle CQLプロセッサを構成できます。
この項では、例10-4に示されるSQL文を使用して、アクセスする表を作成することを想定します。
構成した後に、イベント・ストリームであるようにStock表にアクセスするOracle CQL問合せを定義できます。次の例では、問合せは1つのイベント・ストリームExchangeStreamをStock表と結合します。
例10-5 リレーショナル・データベース表StockのOracle CQL問合せ
SELECT ExchangeStream.symbol, ExchangeStream.price, Stock.exchange FROM ExchangeStream [Now], Stock WHERE ExchangeStream.symbol = Stock.symbol
|
注意: 表ソースの変更が、ストリーム・データと適宜調整されないため、表ソースを 任意の複雑なSQL問合せおよび複数の表を自分のOracle SQL問合せと統合するには、代わりにOracle JDBCデータ・カートリッジの使用を検討してください。 詳細は、『Oracle Fusion Middleware Oracle Complex Event Processing CQL言語リファレンス』のOracle JDBCデータ・カートリッジに関する項を参照してください。 |
リレーショナル・データベース表にアクセスするようにOracle CQLプロセッサを構成する最も効率的かつ間違いの少ない方法は、Oracle CEP IDE for Eclipseを使用することです。
Oracle CEP IDE for Eclipseを使用してOracle CQLプロセッサ表ソースを構成するには:
使用する表が含まれるデータベースのデータ・ソースを作成します。
例10-6では、データ・ソースStockDSのOracle CEPサーバーconfig.xmlファイルの例を示します。
例10-6 データ・ソースStockDSがあるOracle CEP Server config.xmlファイル
<?xml version="1.0" encoding="UTF-8"?>
<n1:config xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/server wlevs_server_config.xsd"
xmlns:n1="http://www.bea.com/ns/wlevs/config/server"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<domain>
<name>ocep_domain</name>
</domain>
...
<data-source>
<name>StockDs</name>
<connection-pool-params>
<initial-capacity>1</initial-capacity>
<max-capacity>10</max-capacity>
</connection-pool-params>
<driver-params>
<url>jdbc:derby:</url>
<driver-name>org.apache.derby.jdbc.EmbeddedDriver</driver-name>
<properties>
<element>
<name>databaseName</name>
<value>db</value>
</element>
<element>
<name>create</name>
<value>true</value>
</element>
</properties>
</driver-params>
<data-source-params>
<jndi-names>
<element>StockDs</element>
</jndi-names>
<global-transactions-protocol>None</global-transactions-protocol>
</data-source-params>
</data-source>
...
</n1:config>
詳細は、『Oracle Fusion Middleware Oracle Complex Event Processing管理者ガイド』のリレーショナル・データベースへのアクセスの構成に関する項を参照してください。
表ノードを作成するには、Oracle CEP IDE for Eclipseを使用します。
6.4.1.1項「基本ノードの作成方法」を参照してください。
Oracle CQLプロセッサを作成するには、Oracle CEP IDE for Eclipseを使用します。
6.4.1.3項「プロセッサ・ノードの作成方法」を参照してください。
表ノードをOracle CQLプロセッサ・ノードに接続します。
6.4.2.1項「ノードの接続方法」を参照してください。
EPNエディタは、ソース表を参照するターゲット・プロセッサ・ノードにwlevs:table-source要素を追加します。
EPNの表ノードを右クリックし、「アセンブリのソースに移動」を選択します。
Oracle CEP IDE for Eclipseはこの表ノードに対するEPNアセンブリ・ファイルを開きます。
EPN内の表に接続しているOracle CQLプロセッサノードを右クリックし、「アセンブリのソースに移動」を選択します。
Oracle CEP IDE for EclipseはこのOracle CQLプロセッサに対するEPNアセンブリ・ファイルを開きます。
Oracle CQLプロセッサ要素のtable-source子要素を、例10-8に示されているように編集します。
ref属性をステップ6で指定したtable要素のidに設定します。
例10-9に示されているように、EPNアセンブリ・ファイルを編集し、表に対してevent-type-repository要素を新しいevent-type子要素で更新します。
アクセスする表の各列にproperty子要素を作成し、表10-2に示されているようにプロパティ属性を構成します。
例10-9 表のEPNアセンブリ・ファイルevent-type要素
<wlevs:event-type-repository>
...
<wlevs:event-type type-name="StockEvent">
<wlevs:properties>
<wlevs:property name="symbol" type="char[]" length="16" />
<wlevs:property name="exchange" type="char[]" length="16" />
</wlevs:properties>
</wlevs:event-type>
...
</wlevs:event-type-repository>
表10-2 EPNアセンブリ・ファイルevent-type要素プロパティ属性
| 属性 | 説明 |
|---|---|
|
|
SQL CREATE TABLE文で指定されている、アクセスする表の列の名前。すべての列を指定する必要はありません。 |
|
|
列のSQLデータ型に対応している表10-3内のOracle CEP Javaタイプ。 例10-4では、 |
|
|
SQL CREATE TABLE文で指定されている列サイズ。 例10-4では、 |
表10-3 SQL列タイプおよびOracle CEPタイプの対応するもの
| SQLタイプ | Oracle CEP Javaタイプ | com.bea.wlevs.ede.api.Type | 説明 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Oracle CQLでの |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Footnote 1 Oracle SQL。
Footnote 2 Oracle以外のSQL。
イベント・タイプの作成の詳細は、次の項を参照してください。
EPN内の表に接続しているOracle CQLプロセッサノードを右クリックし、「構成のソースに移動」を選択します。
Oracle CEP IDE for EclipseはこのOracle CQLプロセッサに対するコンポーネント構成ファイルを開きます。
例10-10に示されているように、コンポーネント構成ファイルを編集して、表のevent-typeを使用するOracle CQL問合せを追加します。
例10-10 表イベント・タイプStockEventを使用するOracle CQL問合せ
<processor>
<name>proc</name>
<rules>
<query id="q1"><![CDATA[
SELECT ExchangeStream.symbol, ExchangeStream.price, Stock.exchange
FROM ExchangeStream [Now], Stock
WHERE ExchangeStream.symbol = Stock.symbol
]]></query>
</rules>
</processor>
|
注意: 表ソースの変更が、ストリーム・データと適宜調整されないため、 |
パフォーマンス向上のため、CQL問合せを、デフォルトで行われているシリアル実行ではなく、パラレル実行できるようにすることが可能です。CQLコードがこれをサポートしている場合、CQLプロセッサで複数のスレッドが使用可能なときは、着信イベントをパラレルに実行するように問合せを構成できます。
問合せ出力イベントの相対的な順序が問合せのダウンストリーム・クライアントにとって重要ではない場合のみ、パラレル問合せ実行を有効にします。たとえば、トランザクション・シーケンスが無関係な、特定の会社に関係する証券取引のセットを顧客に伝えるなど、問合せの主な目的がイベントのフィルタ処理である場合、イベントの順序付けは重要ではないと考えられます。
デフォルト(パラレル実行を有効にしない)では、問合せはチャネルからイベントをシリアルに処理します。システム・タイムスタンプを使用するチャネルを経由してルーティングされるイベントの場合、イベント順序は、イベントが受信される順序です。アプリケーションがタイムスタンプを付けるチャネルを経由する場合、イベント順序は、イベントに含まれるタイムスタンプの値によって決定された順序です。全体順序の制約を緩和すると、構成された問合せは、可能な場合はイベントをパラレルに処理しながら、その問合せのイベント順序を考慮しないようにできます。
パラレル問合せ実行のサポートの指定が主に単純な構成タスクである場合は、機能を最大限に活用できるように、次の手順に必ず従ってください。
パラレル実行をサポートするように、ordering-constraint属性を使用します。
プロセッサに呼び出すスレッドが、パフォーマンスの目標を達成するのに十分であることを確認します。パラレル問合せ実行の最大量は、CQLプロセッサで使用できるスレッドの数によって制約されます。たとえば、プロセッサのアダプタ・アップストリームが必要なスレッドの数をサポートし、アダプタとプロセッサの間にチャネルがある場合、パススルーとして機能するように、max-threadsの数を0にしてチャネルを構成してください。
パススルーを行わない場合、必ずmax-threadsの値を1より大きくして、問合せのアップストリーム・チャネルを構成してください。(max-threadsの値の設定を有用にするには、max-size属性を0より大きい値に設定する必要もあります。)詳細は、第9章「チャネルの構成」を参照してください。
max-threads属性値の設定に関連するその他のガイドラインに従います。たとえば、max-threadsの値の設定を有用にするには、max-size属性を0より大きい値に設定する必要もあります。
必要に応じて、同期化されたブロックの使用などによって、問合せ結果を受け取るBeanがスレッドを認識していることを確認します。たとえば、Beanのコードによって、複数のスレッドで実行された問合せから受け取った結果のリストを作成する場合に、これを行う必要がある可能性があります。
ordering-constraint属性の使用イベントがシリアルに処理されることを保証する、デフォルトの順序付けの制約を緩和することで、パラレル問合せ実行を有効にします。これを行うには、queryまたはview要素でordering-constraint属性を設定します。
例10-11では、可能であれば常に、問合せをパラレルに実行するように、ordering-constraint属性をUNORDEREDに設定します。
例10-11 パラレル実行を許可するように構成された問合せ
<query id="myquery" ordering-constraint="UNORDERED">
SELECT symbol FROM S WHERE price > 10
</query>
ordering-constraint属性は、次の3つの値をサポートします。
ORDEREDは、出力イベントの順序は(入力イベントの順序で暗示されるように)重要であることを意味します。CQLエンジンはイベントをシリアルに処理します。これはデフォルトの動作です。
UNORDEREDは、出力イベントの順序は出力イベントのコンシューマにとって重要ではないことを意味します。これにより、CQLプロセッサはイベントを複数のスレッドでパラレルに処理できるようになります。可能な場合、問合せは複数のスレッドでパラレルに実行して、イベントを処理します。
PARTITION_ORDEREDは、異なるパーティション間の出力イベントの順序が出力イベントのコンシューマにとって重要ではない場合に、パーティション内の出力イベントの順序が(入力イベントの順序で暗示されるように)保持されるよう指定していることを意味します。このような緩和により、CQLエンジンは、パーティション間のイベントを複数のスレッドでパラレルに(可能な場合)処理できるようになります。
指定したパーティションに従っているイベントをシリアルに処理するが、パーティション間の順序は無視し、異なるパーティションに属するイベントをパラレルに処理するよう指定する場合に、Use the PARTITION_ORDEREDの値を使用します。PARTITION_ORDEREDの値を使用する場合、partition-expression属性を追加して、パーティション化用のどの式をパーティション間の順序付けの制約を緩和するための基準とするかも指定する必要があります。
例10-12では、GROUP BY句はsymbolの値に基づいて出力をパーティション化します。partition-expression属性は、特定のsymbolの値に対応するイベントの指定されたサブセット内のイベントをシリアルに処理するよう指定します。一方、パーティション間では順序を無視できます。
一般的に、多くのスレッドを使用可能にして、可能な場合はパラレルで実行できるようにordering-constraint属性を設定することによって、問合せのパフォーマンスが向上すると考えられます。多くのパフォーマンス・チューニング技術と同様、これらの設定で少しずつ試行錯誤を重ねて、より良い結果となる組合せを見つける必要があります。
しかし、問合せでパーティション化を使用し、ordering-constraint属性をPARTITION_ORDEREDに設定した場合でも、期待するスケーリングの量にならない可能性があります。たとえば、4つのスレッドで実行しても2つのスレッドで実行する場合に比べてパフォーマンスがあまり向上しない場合を考えます。このような場合、パーティションを含む問合せの操作でCQLエンジンの特性を最大限に活用するために、partition-order-capacityの値を使用できます。
partition-order-capacityの値は、PARTITION_ORDEREDの問合せを処理する際に指定したプロセッサ・インスタンス内で許可されている並列の最大量を指定します。使用可能なスレッドが異なるパーティションに属するイベントを処理している場合、値は問合せ内で同時に実行できるスレッドの最大数を設定します。
他のパフォーマンス・チューニングの側面と同様、partition-order-capacityを最大限に活用するために、少し実験を行うことがあります。partition-order-capacityを調整する場合、最初に行うこととして適切なのは、CQLプロセッサ・インスタンスでアクティブにするスレッドの最大数にそれを設定することです。場合によっては(たとえば、データが高速である、CQLプロセッサからダウンストリームを処理することが困難など)、partition-order-capacityの値を使用可能なスレッド数より大きく設定しても、有用なことがあります。ただし、パフォーマンス・テストが指定したアプリケーションおよび負荷にとって有用であることを確認する場合、これのみを行う必要があります。
partition-order-capacityの値は4つの場所のうち1つから設定され、2つはユーザーが明示的に設定しない場合のフォールバックとなります。次に、優先順位を示します。
チャネル構成に設定されたpartition-order-capacity要素。プロセッサの入力チャネルでこれを指定した場合、そのプロセッサのPARTITION_ORDERED問合せに対して有効になります。詳細は、付録D「スキーマ参照: コンポーネント構成wlevs_application_config.xsd」のD.67項「partition-order-capacity」を参照してください。
サーバー構成に設定されたpartition-order-capacityプロパティ。チャネルに値が設定されない場合、サーバー上で実行中のすべてのPARTITION_ORDERED問合せに対してこの値が使用されます。詳細は、付録F「スキーマ参照: サーバー構成wlevs_server_config.xsd」のF.29項「partition-order-capacity」を参照してください。
チャネル構成に設定されたmax-threadsの値。プロセッサの入力チャネルでこれを指定した場合、そのプロセッサのPARTITION_ORDERED問合せに対して有効になります。
partition-order-capacityの値とmax-threadsの値のいずれも指定しない場合、またはmax-threadsの値を0に設定した(つまりパススルー・チャネルである)場合に、システムのデフォルト値(現在は4に設定)が使用されます。
partition-order-capacityを使用する場合は、次の点に留意してください。
partition-order-capacityの値は、ordering-constraint属性をPARTITION_ORDEREDに設定している場合のみ有用になります。
partition-order-capacityを増やすと、通常、並列度およびスケーリングが増加します。たとえば、プロファイリングにロック競合のボトルネックが発生した場合、partition-order-capacityを増やして競合が減少しているかどうかを確認することが有用である可能性があります。
パーティション化をCQLプロセッサで行う特定の方法により、partition-order-capacityを使用可能なスレッド数より大きく設定しても、場合によっては有用なことがあります。
非常に高い値を指定すると、使用するメモリーでリソース・コストがかかります。
このパラメータの調整は、アプリケーションおよび入力率の詳細に大きく依存します。実験によって調整することは、最適な値を決定するのに必要な場合があります。
可能であれば常にCQLプロセッサによって使用できるように、サポートを指定するパフォーマンス強化機能として、パラレル問合せ実行を検討してください。すべての問合せをパラレルで実行できるわけではありません。これには、特定のCQL言語機能を使用した問合せが含まれています。
たとえば、問合せで集計のフォーム(値の範囲から最大値を検索するなど)を使用する場合、CQLプロセッサは問合せを完全にはパラレルで実行できない可能性があります(これには、順序付けの制約を考慮して正しい結果を保証する必要があります)。一部の問合せのセマンティクスがそれ自体でも順序付け処理への問合せを制限しています。パラレル実行のサポートを指定しているかどうかに関係なく、このような問合せはシリアルで実行されます。
また、IStream、RStreamおよびDStream演算子は、処理のためにそのオペランドの状態を維持し、問合せを実行するために、CQLプロセッサがスレッドを同期化する必要があるようにします。
CQLプロセッサは、常に問合せのセマンティク目的に配慮していることに注意してください。ordering-constraint属性によってこの目的を変更する場合、この属性は目的を元のままに残す値に強制変換されます。
partitioning-expression属性を使用している場合、この属性は単一の式のみをサポートしていることに留意してください。値への複数のプロパティ名の入力はサポートされていません。
この項では、Oracle CQLプロセッサ構成ファイルの例を記載します。次のものが含まれます。
次の例では、Oracle CQLプロセッサのコンポーネント構成ファイルを示します。
<?xml version="1.0" encoding="UTF-8"?>
<n1:config
xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd"
xmlns:n1="http://www.bea.com/ns/wlevs/config/application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<processor>
<name>proc</name>
<rules>
<view id="lastEvents"><![CDATA[
select mod(price)
from filteredStream[partition by srcId, cusip rows 1]
]]></view>
<query id="q1"><![CDATA[
SELECT *
FROM lastEvents
WHERE price > 10000
]]></query>
</rules>
</processor>
</n1:config>
この例では、name要素はprocプロセッサにOracle CQLルールが構成されていることを指定します。これは、これらのOracle CQLルールを実際のprocプロセッサ・インスタンスとリンクするために、アプリケーションを定義するEPNアセンブリ・ファイルに、procのid属性値を持つ対応するwlevs:processor要素が含まれている必要があることを意味します。(10.6.2項「Oracle CQL Processor EPNアセンブリ・ファイル」を参照)。
このOracle CQLプロセッサ・コンポーネント構成ファイルは、Oracle CQL view文(副問合せ同等のOracle CQL)を指定するための表示の要素も定義します。ビュー選択の結果はダウンストリーム・チャネルに出力されません。
最後に、このOracle CQLプロセッサ・コンポーネント構成ファイルはquery要素を定義し、Oracle CQL問合せ文を指定します。問合せ文は、ビューから選択します。デフォルトでは、問合せの結果はダウンストリーム・チャネルに出力されます。selector要素を使用して、チャネル構成でこの動作を制御できます。詳細は、次を参照してください:
次の例では、Oracle CQLプロセッサのEPNアセンブリ・ファイルを示します。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.bea.com/ns/wlevs/spring
http://www.bea.com/ns/wlevs/spring/spring-wlevs-v11_1_1_6.xsd">
<wlevs:event-type-repository>
<wlevs:event-type type-name="ExchangeEvent">
<wlevs:properties>
<wlevs:property name="symbol" type="char[]" length="16" />
<wlevs:property name="price" type="java.lang.Double" />
</wlevs:properties>
</wlevs:event-type>
<wlevs:event-type type-name="StockExchangeEvent">
<wlevs:properties>
<wlevs:property name="symbol" type="char[]" length="16" />
<wlevs:property name="price" type="java.lang.Double" />
<wlevs:property name="exchange" type="char[]" length="16" />
</wlevs:properties>
</wlevs:event-type>
<wlevs:event-type type-name="StockEvent">
<wlevs:properties>
<wlevs:property name="symbol" type="char[]" length="16" />
<wlevs:property name="exchange" type="char[]" length="16" />
</wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>
<!-- Assemble EPN (event processing network) -->
<wlevs:adapter id="adapter" class="com.bea.wlevs.example.db.ExchangeAdapter" >
<wlevs:listener ref="ExchangeStream"/>
</wlevs:adapter>
<wlevs:channel id="ExchangeStream" event-type="ExchangeEvent" >
<wlevs:listener ref="proc"/>
</wlevs:channel>
<wlevs:table id="Stock" event-type="StockEvent" data-source="StockDs" />
<wlevs:processor id="proc" advertise="true" >
<wlevs:table-source ref="Stock" />
</wlevs:processor>
<wlevs:channel id="OutputStream" advertise="true" event-type="StockExchangeEvent" >
<wlevs:listener ref="bean"/>
<wlevs:source ref="proc"/>
</wlevs:channel>
<osgi:reference id="ds" interface="com.bea.core.datasource.DataSourceService" cardinality="0..1" />
<!-- Create business object -->
<bean id="bean" class="com.bea.wlevs.example.db.OutputBean">
<property name="dataSourceService" ref="ds"/>
</bean>
</beans>