原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/multi_tenancy_ejb
EJBアプリケーションのアーカイブはsampleEJB.jarで、JPA APIでデータベースと対話するstateful session beanが含まれています。このアプリケーションを2個の独立したパーティションにデプロイし、両者がそれぞれ独自のデータベース・インスタンスを指して独立して動作できるようにしたいと考えています。
partition2を別のデータソースに切り替えたい場合、partition2の設定ページの[リソースのオーバーライド]タブでそのように設定すればよいのです。データベースのURLを変更して、別のデータベース・インスタンスをpartition2で使用するように変更することができます。
ワークマネージャを定義したり、特定のパーティションのリソース使用状況を監視したりと、パーティションの設定のページで、できることがその他にもあります。時間をかけると、このあたりで非常に便利なツールが見つかることでしょう。
https://blogs.oracle.com/WebLogicServer/entry/multi_tenancy_ejb
Multi-Tenancy EJB
WLS12.2.1のマルチテナントサポートのおかげで、EJBコンテナは多くの拡張機能を手にしました。アプリケーションとリソースの「かけ算」により、パーティションのことを知らないままでも、EJBコンテナがマルチテナントの機能を提供することができます。別のアプリケーションのコピーがあるおかげで、異なるリモートオブジェクト、Beansプール、キャッシュ、モジュールクラスローダーインスタンスなどにも分離をもたらします。以下でEJBアプリケーションで活用できる新機能のいくつかを挙げています。1. JNDI
- サーバー命名ノードはパーティションを認識します。
- パーティションにデプロイされたアプリケーションには、対応するパーティションのJNDI名前空間で公開されるEJBクライアントビューがあります。
2. Security
- セキュリティ実装は現在、パーティションごとのセキュリティレルムのサポートを含む、複数のアクティブなレルムを認めています。
- ロールベースアクセス制御やパーティションにデプロイされたレルムアプリケーションのための資格証明マッピングは、パーティションが構成したレルムを使います。
3. Runtime Metrics and Monitoring
- PartitionName属性を持つ新しいApplicationRuntimeMBeanインスタンスが、パーティションにデプロイされるアプリケーション毎に作成されます。
- ランタイムMBeanサブツリーを公開するEJBコンテナは、ApplicationRuntimeMBeanインスタンスによって根づかせます。
4. EJB Timer service
- 永続ローカルタイマーは、ストアコンポーネントに依存しています。パーティションカスタムファイルストアは必要なテナントデータの分離を提供します。
- また、裏のクラスタ化されたタイマーはジョブスケジューラを使用しており、これも分離を提供しています。
5. JTA configuration at Partition Level
- JTAタイムアウトは、ドメインレベルとEJBコンポーネントレベルに加えて、パーティション・レベルで設定することができます。
- EJBコンポーネントレベルのタイムアウト値は、他の2つに優先します。
- デプロイメントプランを使って動的更新をサポートします。
6. WebLogic Store
- 永続ローカルタイマーはストアコンポーネントに依存しています。パーティション化されたカスタムファイルストアは必要なテナントデータの分離を提供します。
7. Throttling Thread Resource usage
- 制約のあるワークマネージャは、グローバル・ランタイム・レベルで定義することができ、パーティション内のアプリケーション・インスタンスは、特に対話しないバッチ処理、非同期、メッセージドリブンbeanの呼び出しなどのために、これらの共有ワークマネージャを参照し、スレッドの利用をパーティション全体で絞ることができます。
8. Data Sources for Java Persistence API users
- リソースグループ・テンプレートのシステムリソースとして定義されるデータソースを使う永続性ユニットは、PartitionDataSourceInfoMBeanベースのオーバーライドを利用することができます。
- 高度なカスタマイズを必要とするユースケースは、システムリソースの再構成のために追加された新たなデプロイメントプランのサポートを利用できます。
- アプリケーションパッケージ化されたデータソースモジュールを使用する永続性ユニットは、現在のデプロイメントプランのサポートを利用して、異なるパーティションでコピーを持ち、適切なPDBに向けることができます。
A sample EJB application leveraging Multi-Tenancy
これらの機能の使用を説明するために、マルチテナント環境にEJBアプリケーションの簡単なセットアップを行っていきます。EJBアプリケーションのアーカイブはsampleEJB.jarで、JPA APIでデータベースと対話するstateful session beanが含まれています。このアプリケーションを2個の独立したパーティションにデプロイし、両者がそれぞれ独自のデータベース・インスタンスを指して独立して動作できるようにしたいと考えています。
1. Create Virtual Targets
まずは、2個のパーティションそれぞれに対し、2個の仮想ターゲットを作成します。仮想パーティションでは下図のように異なるURI接頭辞(/partition1と/partition2)を使います。2. Create Resource Group Template
myRGTというリソースグループ・テンプレートを作成しましょう。リソースグループ・テンプレートはWebLogic Server 12.2.1で新たに導入されたコンセプトで、必要なアプリケーションや様々なリソースをデプロイすることができるテンプレートです。アプリケーションのセットアップが複雑な場合、同じことを異なるパーティションで何度も繰り返したくないのでこのリソースグループ・テンプレートは非常に有用です。3. Deploy application and data source
下図のようにアプリケーションをデプロイし、データソースを定義できます。アプリケーションとデータソースはすべてmyRGTスコープで定義されていることに注意してください。4. Create Partitions
すべての準備が完了したので、パーティションを作成します。以下のイメージでは、先ほど作成したリソースグループ・テンプレートをパーティション作成時に適用することができます。指定することができることを示しています。テンプレートに従って、定義されたすべてのものを自動的にデプロイします。5. Access the EJB
パーティションの作成、起動がすんだので、以下のコードでEJBを検索、アクセスすることができます。partition1のURLを使っていますが、もちろんURLを変更して別のパーティションにもアクセスできます。Hashtable<String, String> props = new Hashtable<String, String>();
props.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
props.put(Context.PROVIDER_URL, "t3://server1:7001/partition1");
props.put(Context.SECURITY_PRINCIPAL, user);
props.put(Context.SECURITY_CREDENTIALS, pass);
Context ctx = new InitialContext(props);
BeanIntf bean = (BeanIntf)ctx.lookup("MyEJB");
boolean result = bean.doSomething();
6. Override the data source
どこかまずいと感づいたのであれば、それは正しい感覚です。myRGTにデータソースmyDSを定義し、myRGTを両パーティションに適用したので、両パーティションは同じデータソースを共有しています。通常、これが起こることを望んでいません。2つのパーティションが相互に影響を与えることなく独立して動作してほしいのです。ではどうすれば可能でしょうか。partition2を別のデータソースに切り替えたい場合、partition2の設定ページの[リソースのオーバーライド]タブでそのように設定すればよいのです。データベースのURLを変更して、別のデータベース・インスタンスをpartition2で使用するように変更することができます。
7. Change the transaction timeout
前述の通り、EJBアプリケーションのために、動的に特定のパーティションのトランザクション・タイムアウト値を変更することがサポートされています。これは、パーティションの設定ページでも変更できます。以下の例では、15秒にタイムアウトを設定しています。これは、再起動せずに即座に有効です。ワークマネージャを定義したり、特定のパーティションのリソース使用状況を監視したりと、パーティションの設定のページで、できることがその他にもあります。時間をかけると、このあたりで非常に便利なツールが見つかることでしょう。