3

1つのJPAContainerが次のように作成されると

JPAContainerユーザー=JPAContainerFactory.make(User.class、 "persistenceUnitName");

ここで、「users」コンテナは1つのEntityManagerを使用し、EntityManagerは接続プールからの1つのJDBC接続を使用するとします。

そのリソース使用率(JPAContainerに接続されたEntityManagerに接続されたjdbc接続)はhttprequestの存続期間中に発生しますか、それともentityManager / connectionの使用には別の存続期間がありますか?

1つのJPAContainerインスタンス間のギャップと、EntityManagerを介してjdbc接続がいつどのように使用されるかを理解するのを手伝ってもらえますか?

vaadin jpaコンテナのチュートリアルを読みましたが、この情報が見つかりません。ありがとうございました。

https://vaadin.com/forum/-/message_boards/view_message/1601953

4

1 に答える 1

6

以下を介した JPAContainer の初期化:

JPAContainerFactory.make(User.class, "persistenceUnitName"); 

アプリケーションの存続期間全体で EntityManager を 1 つだけ使用し、他のセッションでも同じ EntityManager を使用します。また、この EntityManager は 1 つの DB 接続を開いており、常にビジー状態に見えます。このアプローチはあまり最適ではなく、アプリケーションのパフォーマンスのボトルネックになる可能性があります。

さて、JPAContainer は次の方法で初期化できます。

JPAContainerFactory.make(User.class, (EntityManager)enityManager); 

このアプローチでは、新しい EntityManager (EM) をいつ作成するかを処理する必要があります。ユーザー/セッションごと、またはユーザー/セッションおよびエンティティごとに新しい EM を作成できます。これは有望に見えますが、JPAContainer には別のボトルネックがあります。JPAContainer は、EntityManager ごとに 1 つのビジー接続を使用します。そのため、独自の entityManager を使用して 100 個の JPAContainer を作成すると、接続プールに 100 個のビジー接続が含まれることになり、これは大きな問題です。したがって、接続解放モードを「after_transaction」に設定する必要があります。これにより、JPAContainer は各クエリの後に強制的に接続を解放します。

persistence.xml

<property name="hibernate.connection.release_mode" value="after_transaction" />

いずれにせよ、これらは JPAContainer を非常に使いやすくする単なるトリックですが、魔法は期待できません。JPAContainerには他にも多くの問題があります

  • 遅延読み込みをサポートしていません
  • バッチ読み込みをサポートしていません。各エントリは、1 つのクエリ + 各リレーションに対して 1 つのクエリによって読み込まれます。
  • JPAContainer を更新する場合は、それ自体が循環し、更新に永遠に時間がかかります

この投稿を見てください。プレーンな JPA または Hibernate の namedQuery または CriteriaBuilder を BeanItemContainer と共に使用することをお勧めします。 変更をデータベース vaadin に保存します

于 2013-07-26T08:39:07.220 に答える