0

私は現在、データベースと対話するためにステートレス セッション Bean を呼び出す Web アプリケーションを扱っています。私の質問は、そのようなアプリケーションが同じセッション Bean を呼び出して、後者がデータベースへのアクセスに使用する必要があるエンティティ マネージャーを選択できる方法についてです。

現時点では、さまざまな Jboss インスタンスを起動し、さまざまなポートでリッスンすることでこの状況を管理しており、各インスタンスで同じセッション Bean プールをデプロイしており、1 つ以上の Web アプリケーションが同じデータベースを処理する必要があります。つまり、すべての Jboss インスタンスには、特定の数の Web アプリケーション、永続化ユニット(persistence.xml in META-INF jar containing the @Entity's)、およびセッション Bean のプールがすべて ear 内に含まれています。主な弱点がどこにあるのかは自明です。より多くの異なるデータベースを処理する必要があり、多くの Jboss インスタンスを維持する必要があり、リソースの理由だけでなく、主に持続可能ではありません。

私の最後の質問は、注入された EntityManager のみが異なる、異なる Web アプリケーション呼び出しセッション Bean をデプロイするためのベスト プラクティスは何ですか?

前もって感謝します

Stfn

4

2 に答える 2

1

CDI@Producer方式で行います。持っている多数の s を区別する方法を知っていると仮定している@PersistenceContextので、次のようなプロデューサーを作成します。

// first inject all the entity managers that you have into your CDI producer
@PersistenceContext(name = "name0")
private EntitManager em0;

@PersistenceContext(name = "name1")
private EntitManager em1;

@PersistenceContext(name = "name2")
private EntitManager em2;

...

// then have your producer method with logic to chose the right EntityManager to be returned
@Produces @MyPersistenceContext
public EntityManager obtainTheRightEM(InjectionPoint caller) {
    if (hasCondition0(caller)) {
        return em0;
    } else if (hasCondition1(caller)) {
        return em1;
    } else if (hasCondition2(caller)) {
        return em2;
    } else {
        ...
    }
}

次に、を@EJBに置き換えます。@PersistenceContext@Inject @MyPersistenceContext

また、@MyPersistenceContext特定の問題によっては、修飾子の作成が必要な場合とそうでない場合があります。プロデューサーから返される値の決定を容易にするためにプロデューサーに渡す必要がある特定の構成値がある場合は、カスタム修飾子でいくつかのフィールドEntityManagerを使用することを検討してください。@Nonbinding

展開が 1 つだけで済む場合もあり@EJBます。

乾杯!お役に立てれば。

于 2012-11-02T13:25:33.817 に答える
0

あなたが達成したいことは本当に明確ではありません...

異なる顧客からのデータを分離するために異なる DB が使用されていますか (各 DB は同じ構造を持っています)? このため、Hibernate (http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch16.html) には複数テナントのサポートがありますが、JPA ではまだ標準化されていません。

リソース消費を削減するために、同じ Jboss インスタンスに別の耳を配置する方法 (別の Web コンテキスト名を使用する必要があります)。(ただし、OS レベルのプロセス制御が失われます。1 つのテナントがすべてのリソースを使用して、他のテナントが最小限のリソースを取得することを確認する方法がありません。)

于 2012-11-02T10:08:23.557 に答える