1

私のpersistence.xmlには、postgreSQLスキーマによる永続ユニットが多数あります。

EntityManagerFactory を動的に作成することで、必要なときにいつでも EntityManager をインスタンス化します。

EntityManagerFactory emf = Persistence.createEntityManagerFactory(schemaToChoose);
EntityManager em = emf.createEntityManager();

そしてそれはうまくいきます。ただし、コンテナ インジェクションは使用しません。

さて、この方法でリソースをあまり消費しないのだろうか?

私はおそらく JPA キャッシュをよく理解していませんが、エンティティは em キャッシュ内と emf キャッシュ内に格納されていると思います。2 つのレベルがあります。したがって、em と emf をインスタンス化するたびに JPA キャッシュが失われる可能性があるため、毎回再作成します。

2 つの質問があります: emf と em がパフォーマンスに影響を与えるたびにインスタンス化できますか? キャッシュを保持する代わりに、スキーマを持っているのと同じ数の em を注入する必要がありますか?

ありがとうございました

4

2 に答える 2

2

EntityManagerFactory は、重量があり、作成に時間がかかるオブジェクトです。一度だけ作成してから再利用する必要があります。実際、作成されるたびに、persistence.xml ファイルを解析し、すべてのエンティティのマッピング メタデータを計算します。

Java EE コンテナ内で実行している場合は、必ずコンテナにインスタンス化させ、EJB 内にエンティティ マネージャを注入する必要があります。

1 つのアプリケーションが複数のデータベース スキーマを使用するのは奇妙だと思います。なぜそうなのですか?

キャッシュに関して: エンティティ マネージャーに関連付けられた第 1 レベルのキャッシュがあります (これは短命のキャッシュで、通常はトランザクションと同じ寿命を持ちます。エンティティ マネージャー ファクトリですが、これは既定ではオフになっています。有効になっている場合は、一部のエンティティにのみ使用し、注意して構成する必要があります。

于 2012-11-23T09:39:28.407 に答える
0

基本的にマルチテナント パターンがあります。EJB インジェクションはこれをうまく処理できません。

EntityManagerFactory は、複数回作成するものではなく、共有キャッシュを含みます。(共有キャッシュのデフォルトはJPAでは指定されていません。EclipseLinkではデフォルトでオンになっていますが、JPAキャッシュ・モードと@Cacheableおよび@Cacheを使用して構成できます)。

工場にはある種のレジストリをお勧めします。おそらくこれは、Universe などのアプリケーション オブジェクトでさえあるでしょう。

public class Universe {
    static Map<String, Universe> universes;
    EntityManagerFactory emf;

    public static Universe getUniverse(String schema) {
      ... hopefully you get the idea ...
    }
    public EntityManagerFactory getEntityManagerFactory() {
        return emf;
    }
}

また、EclipseLink のマルチテナント サポートについて調べることをお勧めします。

http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_multitenant.htm#BABEGBIJ

于 2012-11-26T14:11:34.350 に答える