2012-07-17 93 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