ヘッダーをスキップ
Oracle SOA Suite開発者ガイド
10g(10.1.3.1.0)
B31839-01
  目次へ
目次
索引へ
索引

前へ
前へ
 
次へ
次へ
 

7.6 データベースとの通信

Oracle BPEL Process Managerとデータベースが通信するには、データベースをWebサービスとして公開します。他のWebサービスと同様に、この通信はパートナ・リンクに定義されます。ただし、BPELプロセスがデータベース表にアクセスできるようにするには、アダプタを構成する必要があります。Oracle BPEL Process Managerのアダプタ構成ウィザード機能を使用して、BPELプロセスをデータベース表、ファイル・システム、データベース・キュー、Java Message Service(JMS)およびOracle Applicationsと統合します。パートナ・リンクを作成し、データベース・アダプタ・サービスを定義すると、アダプタ構成設定が記載されたWSDLファイルが作成されます。

データベース・アダプタは、任意のリレーショナル・データベースと接続します。非リレーショナル・データベースやレガシー・システムの場合は、アプリケーション・アダプタおよびメインフレーム・アダプタを使用できます。アプリケーションおよびメインフレーム用のアダプタについては、『Oracle Application Server Adapter概要』を参照してください。

既存のリレーショナル・スキーマにアクセスするには、アダプタ構成ウィザードを使用して次の操作を実行します。

BPELプロセスによってXMLが処理されてWebサービスが起動される間、データベース行と値の問合せ、挿入および更新が実行されます。

データベース・アダプタには次の特徴があります。

詳細は、『Oracle Application Server Adapters for Files, FTP, DatabasesおよびEnterprise Messagingユーザーズ・ガイド』を参照してください。

7.6.1 データベース・アダプタの構成方法

アダプタ構成ウィザードを使用して、データベース・アダプタを構成します。ウィザードでは、データベースからの表のインポート、複数の表にわたるリレーションシップの指定、対応するXMLスキーマ定義の生成、および必要なSQLまたはデータベース操作を公開するサービスの作成を実行できます。これらのサービスは、BPELプロセスで使用されるパートナ・リンクの定義に使用されます。アダプタ・サービスの作成および編集のいずれにもアダプタ構成ウィザードを使用します。

データベース・アダプタを構成する手順は、次のとおりです。

  1. 「Database Adapter」サービスを「サービス」スイムレーンのいずれかにドラッグ・アンド・ドロップします。

  2. サービス名を入力します。

  3. アダプタ構成ウィザードのサービス接続ページを使用して、データベース接続を指定し、Java Naming and Directory Interface(JNDI)名を入力するか、デフォルトのJDNI名をそのまま使用します。

    JNDI名は、サービスのOracle BPEL Serverへのデプロイ時に使用される接続のプレースホルダとして機能します。これによって、開発用と本番用に異なるデータベースを使用できます。アダプタ構成ウィザードによって、生成されたWSDLの設計時の接続も取得され、ランタイム・ルックアップに失敗した場合の予備として機能します。

  4. アダプタ構成ウィザードの操作タイプ・ページを使用して、操作タイプを選択します。

    • ストアド・プロシージャまたはファンクションの呼出し: サービスでストアド・プロシージャまたはファンクションを実行する場合は、このオプションを選択します。

    • 表に対して操作を実行: このオプションは、アウトバウンド操作に対して選択します。「挿入/更新」「削除」「選択」、またはこの3つの任意の組合せを選択できます。これらの操作は、同等のSQL操作であるINSERTUPDATEDELETEおよびSELECTに変換されます。3つのオプションすべてを選択した場合は、ウィザードの実行後、「Invoke」ウィンドウの「操作」リストに、「merge」「insert」「update」「write」「delete」serviceNameSelect」および「queryByExample」の操作が表示されます。

    • 表の新規レコードまたは更新されたレコードをポーリング: このオプションは、インバウンド操作(つまり、receiveアクティビティと関連付けられている操作)に対して選択します。この操作タイプでは、指定された表がポーリングされ、追加された新しい行の処理用に戻されます。また、ポーリング頻度も指定できます。

  5. アダプタ構成ウィザードの表の選択ページを使用して、インポート済の表を選択するか、表をインポートします。

    操作のルート・データベース表を選択します。複数の関連する表を使用している場合は、これがリレーションシップ・ツリーの最上位レベルの表(または最上位の親表)になります。このページには、プロジェクトに以前にインポートした表がすべて表示されます(他のパートナ・リンク用にインポートした表も含まれます)。したがって、構成された表定義は、指定されたBPELプロジェクトの複数のパートナ・リンクにわたって再利用できます。これらは生成されたTopLinkディスクリプタです。

    表をインポートする場合は、「表のインポート」をクリックし、スキーマを選択して「問合せ」をクリックし、「使用可能」リストから「選択済」リストに必要な表を移動します。

    表を再インポートする必要がある場合(データベースで表構造が変更されていた場合など)は、その表を再度インポートします。これによって、以前に構成された表定義が上書きされます。表を再インポートすると、その表に定義したカスタム・リレーションシップとカスタムのWHERE句が消失します(インポートする表がルート表の場合)。

  6. 「次へ」をクリックします。

  7. アダプタ構成ウィザードの主キーの定義ページを使用して、前のステップで選択した各表に主キーを定義します。

    このページは、主キーが定義されていない場合に表示されます。インポートしたすべての表に主キーを指定する必要があります。マルチパート主キーを指定する必要がある場合は、複数のフィールドを選択できます。ここで指定する主キーは、オフライン・データベース表に記録され、データベース・スキーマには格納されないため、データベース・スキーマは変更されません。

  8. アダプタ構成ウィザードのリレーションシップ・ページを使用して、2つの表の間に新しいリレーションシップを作成したり、表の間のリレーションシップを削除します。

    1. 「作成」をクリックします。

    2. 親表と子表を選択します。

    3. マッピング・タイプ(1対多、1対1、または子表に外部キーのある1対1)を選択します。

    4. 外部キーのフィールドを主キーのフィールドに関連付けます。

    5. リレーションシップに名前を指定するか、デフォルトの名前をそのまま使用します。


    注意:

    親として選択できるのは、ルート表からアクセス可能な表のみです。

  9. アダプタ構成ウィザードのオブジェクトのフィルタ・ページを使用して、オブジェクト・モデルを確認します。

  10. アダプタ構成ウィザードの選択条件の定義ページを使用して、SQL問合せをさらに定義します。

    1. 「パラメータ」セクションで、「追加」をクリックしてパラメータを追加します(アウトバウンド操作の場合のみ)。パラメータを削除するには、パラメータをハイライト表示して「削除」をクリックします。

    2. 「SQL」セクションで、アウトバウンド操作のSQL構文を編集します(インバウンド操作の構文は読取り専用です)。あるいは、「編集」をクリックし、式ビルダーを使用してアウトバウンドとインバウンドの両方の操作を編集します。

    3. 「単一結果セットを返す」オプションを使用して、単一のSQL SELECT文で複数の関連する表を問い合せ、単一の結果セットを戻します。

詳細は、『Oracle Application Server Adapters for Files, FTP, DatabasesおよびEnterprise Messagingユーザーズ・ガイド』の次の項目に関する説明を参照してください。

  • WebサービスとしてのSQL操作

  • ポーリング計画

  • リレーションシップの作成

  • ストアド・プロシージャおよびファンクション

  • 単一の結果セットの戻しに関連するパフォーマンスの問題

  • その他のアダプタ(AQ、File、FTP、JMS、MQ、Oracle Applicationsなど)

7.6.2 データベース・アダプタ構成時の処理内容

表をインポートすると、Oracle JDeveloper BPEL Designerのオフライン表サポートによって、データベース表のオフライン・スナップショットが作成されます。このオフライン・バージョンの表は、実際のデータベース表に影響を与えずに変更できます(たとえば、外部キー制約を追加できます)。オフライン表の変更によって、その表のTopLinkディスクリプタとそれに関連するJavaソース・ファイルが作成され、ディスクリプタのすべての属性が、対応するデータベースの列に自動マップされます。TopLinkディスクリプタによって、Javaクラスがオフライン・データベース表にマップされます。

最も一般的なデータ列は、フィールドへの直接マッピングとしてマップされます。つまり、データベース列の値が属性に直接マップされます。たとえば、データベースのSALARY列がオブジェクト・モデルのsalary属性にマップされると、その属性にはその列の値が入ります。

インポートされる表に外部キー制約がすでに設定されている場合は、該当する表の間にリレーションシップ・マッピングが自動的に生成されます。必要な数のシナリオを多くカバーするために、検出されたすべての外部キー制約に対して、2つのマッピング(ソース表からターゲット表への1対1のマッピングとターゲット表からソース表への1対多のマッピング)が生成されます。これが完了すると、BPELプロジェクトにOracle TopLink Workbenchプロジェクトが表示されます。


注意:

ディスクリプタ生成プロセスの一部として作成されるJavaクラスは、実際にプロセスとともにデプロイされたり、実行時に使用されることはありません。これらのJavaクラスは設計時には存在しています。これは、Oracle TopLink Workbenchでは各ディスクリプタがJavaクラスに関連付けられていることを前提としているためです。プロセスがデプロイされると、マッピング・メタデータはtoplink_mappings.xmlに格納されます。

表のインポートが終了した後は、ルート・データベース表を選択する必要があります。この選択では、実際には、自動生成された問合せを格納するTopLinkディスクリプタを選択しています。

設計時には、次のファイルが生成されます。

  • service_name.wsdl: データベース・アダプタ・サービスの定義が格納されます。

  • RootTable.xsd: ルート・オブジェクトのXMLタイプの定義です。

  • toplink_mappings.xml: BPELプロジェクトのTopLinkマッピング・メタデータが格納されます。これは、サーバーにデプロイされる唯一のTopLinkアーチファクトです。

例7-6に、データベース・アダプタWSDLファイル(Order.wsdl)のソース・コードを示します。このコードは、SOA Order Bookingアプリケーションで、データベースへの注文情報の書込みに使用されます。

例7-6 Order.wsdlのソース・コード

<?xml version="1.0" encoding="UTF-8"?>
<definitions
    name="Order"
    targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/db/Order/"
    xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/db/Order/"
    xmlns:plt="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
    xmlns:jca="http://xmlns.oracle.com/pcbpel/wsdl/jca/"
    xmlns:pc="http://xmlns.oracle.com/pcbpel/"
    xmlns:top="http://xmlns.oracle.com/pcbpel/adapter/db/top/Order"
    xmlns:hdr="http://xmlns.oracle.com/pcbpel/adapter/db/"
    xmlns="http://schemas.xmlsoap.org/wsdl/">
    <import namespace="http://xmlns.oracle.com/pcbpel/adapter/db/"
            location="DBAdapterOutboundHeader.wsdl"/>
    <types>
        <schema xmlns="http://www.w3.org/2001/XMLSchema">
            <import namespace="http://xmlns.oracle.com/pcbpel/adapter/db/top/Order"
                schemaLocation="Order_table.xsd"/>
        </schema>
    </types>
    <message name="OrdersCollection_msg">
        <part name="OrdersCollection" element="top:OrdersCollection"/>
    </message>
    <portType name="Order_ptt">
        <operation name="merge">
            <input message="tns:OrdersCollection_msg"/>
        </operation>
        <operation name="write">
            <input message="tns:OrdersCollection_msg"/>
        </operation>
    </portType>
    <binding name="Order_binding" type="tns:Order_ptt">
        <jca:binding />
        <operation name="merge">
            <jca:operation
                InteractionSpec="oracle.tip.adapter.db.DBWriteInteractionSpec"
                DescriptorName="Order.Orders"
                DmlType="merge"
                DetectOmissions="true"
                OptimizeMerge="true"
                MappingsMetaDataURL="Order_toplink_mappings.xml" />
            <input>
                <jca:header message="hdr:OutboundHeader_msg" part="outboundHeader"/>
            </input>
        </operation>
        <operation name="write">
            <jca:operation
                InteractionSpec="oracle.tip.adapter.db.DBWriteInteractionSpec"
                DescriptorName="Order.Orders"
                DmlType="write"
                MappingsMetaDataURL="Order_toplink_mappings.xml" />
            <input>
                <jca:header message="hdr:OutboundHeader_msg" part="outboundHeader"/>
            </input>
        </operation>
    </binding>
    <!-- Your runtime connection is declared in
        J2EE_HOME/application-deployments/default/DbAdapter/oc4j-ra.xml
        These 'mcf' properties here are from your design time connection and save you from having
        to edit that file and restart the application server if eis/DB/SOADemo is missing.
        These 'mcf' properties are safe to remove.
    -->
    <service name="Order">
        <port name="Order_pt" binding="tns:Order_binding">
            <jca:address location="eis/DB/soademo"
                UIConnectionName="SOADemo"
            />
        </port>
    </service>
    <plt:partnerLinkType name="Order_plt" >
        <plt:role name="Order_role" >
            <plt:portType name="tns:Order_ptt" />
        </plt:role>
    </plt:partnerLinkType>
</definitions>