この章では、Oracle NoSQLデータ・カートリッジを使用してOracle NoSQL DatabaseをOracle Event Processingイベント処理ネットワークに統合し、データベースのデータを問い合せる方法について説明します。
Oracle NoSQL Databaseは、分散キー/値型データベースです。ここでは、データがキー/値ペアとして格納され、ペアは特定のストレージ・ノードに書き込まれます。ストレージ・ノードをレプリケートすることで、高可用性、ノード障害が発生した場合の迅速なフェイルオーバー、および問合せの最適なロード・バランシングを実現します。
このマニュアルの内容は、読者がOracle NoSQL Databaseにすでに精通していて、運用しているものと想定しています。Oracle NoSQLの詳細は、Oracle Technology Networkのそのページ(http://www.oracle.com/technetwork/products/nosqldb/
)を参照してください。
注意: NoSQLデータ・カートリッジを使用するには、NoSQL Enterprise Editionのライセンスが必要です。 |
この章の内容は次のとおりです。
Oracle Event Processing NoSQL Databaseデータ・カートリッジを使用すれば、Oracle CQL問合せの一部としてOracle NoSQL Databaseに格納されたデータを参照できます。カートリッジにより、問合せでは、キーを指定し、そのキーに関連付けられた値のフィールドを参照することで、Oracle NoSQL Databaseストアから値を取得できます。
Oracle NoSQL Databaseを統合する際には、次のガイドラインに留意してください。
NoSQL Databaseは、その独自のメカニズムによって起動され、アクセス可能であることが必要です。これは、Oracle Event Processingによって直接管理されません。
このリリースのカートリッジは、リリース1.2.123のOracle NoSQL Database APIを使用するデータベースへのアクセスを提供します。
問合せでキーとして使用されるプロパティは、String
型であることが必要です。結合では単一のキーのみを使用できます。
結合には等号演算子を使用する必要があります。その他の演算子は、結合条件ではサポートされません。
NoSQL Databaseに影響を及ぼす暴走する問合せはサポートされません。
CQLアプリケーションでOracle Event Processing NoSQL Databaseデータ・カートリッジを使用するには、1つ以上のアプリケーション・スコープ指定カートリッジ・コンテキストで、そのアプリケーション用に宣言し、構成する必要があります。
既存のNoSQL Databaseの統合は、リレーショナル・データベースの表を統合する方法と似ています。NoSQL Databaseの場合、EPNアセンブリ・ファイルを次の方法で更新します(例19-1「NoSQL Databaseを統合するEPN」を参照)。
NoSQLデータ・ソースを参照するために、ネームスペース宣言を追加して、store
要素をサポートします。
変更では、schemaLocation属性にネームスペース・スキーマの場所を、ネームスペースおよび接頭辞の宣言とともに追加する必要があります。
http://www.oracle.com/ns/oep/nosqldb http://www.oracle.com/ns/oep/nosqldb/oep-nosqldb.xsd
xmlns:nosqldb="http://www.oracle.com/ns/oep/nosqldb"
store
要素を追加して、NoSQL Databaseをリレーション・ソースとしてイベント処理ネットワークに統合します。
ストア要素では、次の属性(すべてが必須)をサポートします。
id
: CQL問合せでキー/値ストアを参照するために使用される名前。
store-name
: キー/値ストアの名前で、ストアの作成時にKVStoreConfigクラスで指定した名前と一致させる必要があります。
store-locations
: ストア内のアクティブ・ノードの1つ以上のホスト名およびポート。属性値は、空白区切りのリストで、各エントリはhostname:portの形式です。指定したホスト名およびポートの値を持つノードは、ストアに最初に接続したときに、順番に接続されます。
event-type
: このリレーションのためにストア内の値から取得されたすべてのオブジェクトのオブジェクト型。属性値は、wlevs:event型リポジトリ・エントリで指定されたwlevs:event型エントリの名前に対応する必要があります。
table-source
要素を追加して、NoSQL Databaseを問合せが実行されるプロセッサに接続します。
例19-1「NoSQL Databaseを統合するEPN」では、イベント処理ネットワークをNoSQL Databaseに接続する方法を説明しています。store
要素は、ホストkvhost-alpha上のポート5000またはホストkvhost-beta上のポート5010を使用して最初の接続を行い、"kvstore-customers"という名前のストアへのアクセスを提供します。Oracle CQLプロセッサP1を定義し、キー/値ストアのデータを"CustomerDescription"という名前のリレーションとしてP1で使用できるようにします。
ストアは、"CustomerDescription"の名前を使用して、Oracle CQL問合せ内で参照できます。ストアから取得される値はすべて、CustomerDescriptionクラスのシリアライズ・インスタンスです。
例19-1 NoSQL Databaseを統合する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" xmlns:nosqldb="http://www.oracle.com/ns/oep/nosqldb" 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/ocep-epn.xsd http://www.oracle.com/ns/oep/nosqldb http://www.oracle.com/ns/oep/nosqldb/oep-nosqldb.xsd"> <!-- Provide access to the CustomerDescription class, which represents the type of values in the store. --> <wlevs:event-type-repository> <wlevs:event-type type-name="CustomerDescription"> <wlevs:class>com.bea.wlevs.example.CustomerDescription</wlevs:class> </wlevs:event-type> <wlevs:event-type type-name="SalesEvent"> <wlevs:class>com.bea.wlevs.example.SalesEvent</wlevs:class> </wlevs:event-type> </wlevs:event-type-repository> <!-- The store element declares the key-value store, along with the event type to which incoming NoSQL data will be bound. --> <nosqldb:store store-name="kvstore-customers" store-locations="kvhost-alpha:5000, kvhost-beta:5010" id="CustomerDescription" event-type="CustomerDescription"/> <wlevs:channel id="S1" event-type="SalesEvent"> <wlevs:listener ref="P1"/> </wlevs:channel> <!- The table-source element links the store to the CQL processor. --> <wlevs:processor id="P1"> <wlevs:table-source ref="CustomerDescription" /> </wlevs:processor> </beans>
例19-1「NoSQL Databaseを統合するEPN」で定義されたイベント・タイプは、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』で説明されているように、JavaBeansクラスとして実装されます。
Oracle CQL問合せでstore
要素により指定したストア内のエントリを参照する場合、それらのエントリの値は、イベントタイプ属性で指定した型のシリアライズ・インスタンスであることが必要です。イベント・タイプ・クラスはjava.io.Serializable
を実装する必要があります。
問合せでストアからシリアライズされた有効な形式でない値を取得する場合、または値が指定したクラス用にシリアライズされた形式でない場合、Oracle Event Processingでは例外が発生し、イベント処理が中止されます。複数のstore
要素を宣言して、同一または異なるストアから異なるデータ型の値を返すことができます。
NoSQL Databaseをイベント処理ネットワークに統合すると、Oracle CQLコードからデータにアクセスできます。問合せでは、WHERE
句で等価リレーションを指定することで、ストアのエントリを検索できます。
例19-2「NoSQL Databaseのデータを使用するOracle CQL問合せ」のOracle CQLコードでは、FROM
句内のCustomerDescription
が、例19-1「NoSQL Databaseを統合するEPN」に示すストア要素内のid
属性値に対応します。
例19-2 NoSQL Databaseのデータを使用するOracle CQL問合せ
<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>P1</name> <rules> <query id="q1"><![CDATA[ SELECT customerName, creditScore, price, item FROM S1 [Now], CustomerDescription as cust WHERE S1.userId = cust.userId AND creditScore 5 ]]></query> </rules> </processor> </n1:config>
この例では、S1チャネルおよびCustomerDescription NoSQLデータ・ソースのデータを表すイベント・タイプ・インスタンスは、どちらも『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のイベント・タイプの定義と使用に関する項で説明されているようにJavaBeansクラスとして実装されます。どちらのイベント・タイプもJavaBeansクラスであるため、Oracle CQL問合せでは、イベントのユーザーIDとWHERE
句内の顧客の説明のIDをどちらもJavaBeansプロパティとして扱って等価とすることで、特定のイベントに関連付けられた顧客の説明にアクセスできます。
WHERE S1.userId = CustomerDescription.userId
この句では、イベントのuserId
フィールドの値で指定されたキーを持つストアからエントリを取得することを要求します。ストアからのエントリ取得では、等価リレーションのみがサポートされます。
ストアからエントリが選択されると、そのストアから取得された値のフィールドは、問合せのSELECT
の部分、またはWHERE
句内の追加の句で参照することができます。
SELECT
句で指定したcreditScore
値では、ストアから取得したCustomerDescription
オブジェクトのcreditScore
フィールドの値が問合せの出力に含まれます。WHERE
句のcreditScore
に対する参照でも、問合せはCustomerDescription
creditScore
フィールドの値が5より大きいイベントにさらに制限されます。
ストアからのエントリ取得に使用されるキーは、値をスラッシュ(/)で始めるか、スラッシュを省略するかのいずれかの方法で書式を設定できます。
等価リレーションの左側に指定した値がスラッシュで始まる場合、キーは1つ以上の主要コンポーネントを(必要な場合はマイナー・コンポーネントも)指定するフル・キーとして扱われます。キー・パスの構文の詳細は、http://docs.oracle.com/cd/NOSQL/html/javadoc/index.html
のOracle NoSQL Database APIドキュメントにあるoracle.kv.Key
クラスに関する情報を参照してください。
たとえば、SalesEvent
オブジェクトのuserId
フィールドに値"/users/user42/-/custDesc"がある場合、その値はusersを1つ目の主要コンポーネントとして、ユーザーIDのuser42を2つ目の主要コンポーネントとして、そしてcustDescというマイナー・コンポーネントを指定するフル・キー・パスとして処理されます。
便宜上、等価リレーションの左側に指定した値がスラッシュで始まっていない場合は、キー全体を構成する1つの主要コンポーネントとして処理されます。
ストアからエントリを取得するために使用されるキーは、Oracle CQL問合せでアクセスされる1つのフィールドで完全な形で指定する必要があります。特に、複数のコンポーネントを指定したキー・パスがキー/値ストア内のエントリにアクセスするために必要な場合、問合せによってアクセスされる1つのフィールドにフル・キー・パス式を格納する必要があります。