2012-07-17 67 views
3

一旦一個JPAContainer就像Vaadin JPAContainer JDBC連接使用

JPAContainer用戶= JPAContainerFactory.make(User.class 「persistenceUnitName來」)創建的;

現在我想「users」容器將使用一個EntityManager,它反過來使用連接池中的一個JDBC連接。

資源利用率(連接到JPAContainer的EntityManager上的jdbc連接)在httprequest的生命週期中發生,或者entityManager/connection的使用有另一個生命期?

您能否幫我理解一個JPAContainer實例與何時以及如何通過EntityManager使用jdbc連接之間的差距?

我讀了vaadin jpa容器教程,我在那裏找不到這些信息。 謝謝。

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

回答

6

JPAContainer初始化通過:

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

使用一個也是唯一一個整個應用程序生命週期中EntitiyManager,即使其他會話使用相同的EntityManager。此外,此EntityManager已打開一個數據庫連接,並且它始終處於忙碌狀態。這種方法不是非常優化,它可能成爲應用程序性能的瓶頸。

好,JPAContainer可以通過初始化:

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

在這種方法中,你必須處理的時候,創造新的EntityManager(EM)。您可以爲每個用戶/會話或每個用戶/ Sesssion和實體創建新的EM,這取決於您。這看起來很有前途,但JPAContainer有其他瓶頸。 JPAContainer每個EntityManager使用一個繁忙的連接。因此,如果使用自己的entityManager創建100個JPAContainer,則連接池將包含100個忙連接,這是一個大問題。因此,您必須將連接釋放模式設置爲「after_transaction」,這將強制JPAContainer在每次查詢後釋放連接。

的persistence.xml

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

不管怎樣,這些都只是技巧,這使得JPAContainer非常有好處的,但不要指望魔術。 JPAContainer有更多的其他問題

  • 不支持延遲加載
  • 不支持批量入庫,每個條目由一個查詢+的每個關係,如果你想刷新JPAContainer其週期
  • 一個查詢加載本身並需要永遠刷新

看看這篇文章。最好使用普通的JPA或Hibernate命名的Query或CriteriaBuilder和BeanItemContainer。 Save changes to database vaadin