一旦创建了一个JPAContainer

JPAContainer用户= JPAContainerFactory.make(User.class,“persistenceUnitName”);

现在,我假设“用户”容器将使用一个EntityManager,而EntityManager依次使用来自连接池的一个JDBC连接。

在httprequest的生命周期内发生资源利用率(jdbc连接到EntityManager的Jdbc连接到EntityManager)还是在实体管理器/连接的使用具有另一个寿命?

您能否帮助我了解一个JPAContainer实例与何时以及如何通过EntityManager使用jdbc连接之间的差距?

我阅读了vaadin jpa容器教程,但在那儿找不到此信息。
谢谢。

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

最佳答案

通过以下方式初始化JPAContainer:

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

在整个应用程序生命周期中仅使用一个EntitiyManager,即使其他会话也使用相同的EntityManager。另外,此EntityManager已打开一个数据库连接,并且看起来一直很忙。这种方法不是很理想,它可能成为应用程序性能的瓶颈。

好了,可以通过以下方式初始化JPAContainer:
JPAContainerFactory.make(User.class, (EntityManager)enityManager);

用这种方法,您必须处理何时创建新的EntityManager(EM)。您可以根据每个用户/会话或每个用户/会话和实体创建新的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 namedQuery或CriteriaBuilder与BeanItemContainer一起使用。
    Save changes to database vaadin

    10-06 04:12