【问题标题】:Vaadin JPAContainer JDBC Connection UsageVaadin JPAContainer JDBC 连接使用
【发布时间】:2012-07-17 16:41:18
【问题描述】:

一旦像这样创建一个 JPAContainer

JPAContainer users = JPAContainerFactory.make(User.class, "persistenceUnitName");

现在我假设“用户”容器将使用一个 EntityManager,而后者又使用连接池中的一个 JDBC 连接。

资源利用(附加到 JPAContainer 的 EntityManager 的 jdbc 连接)发生在 httprequest 的生命周期内,或者 entityManager/connection 的使用有另一个生命周期?

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

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

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

【问题讨论】:

    标签: java jdbc vaadin


    【解决方案1】:

    JPAContainer 初始化通过:

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

    在整个应用程序生命周期中使用一个且仅一个 EntityManager,即使其他会话也使用相同的 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.

    【讨论】:

      猜你喜欢
      • 2012-11-20
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多