JPAContainer 保持数据库的连接打开

JPAContainer keeps database's connections open

我遇到了这个问题:使用 vaadin 7,我已经配置了我的 persistence.xml,这是代码

<?xml version="1.0" encoding="UTF-8"?>

http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 版本="2.0">

<persistence-unit name="xxxx">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
    <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://xxxxx;databaseName=xxxx;"/>
    <property name="javax.persistence.jdbc.user" value="xxxx"/>
    <property name="javax.persistence.jdbc.password" value="xxxx"/>
    <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="hibernate.connection.release_mode" value="after_transaction" />
    </properties>
</persistence-unit>

当我创建一个新的 JPAContainer 并将其绑定到 Table 时,我在 MSSQL Activity 上看到监视我的新连接,但是如果我的会话超时或注销后,我仍然看到 SQL 上的连接。

如果我重新登录我的应用程序并刷新 table,则会打开一个新连接,依此类推。

我的问题是我的 sql 服务器上有大量打开的连接,这些连接从未关闭过。

我尝试添加 属性

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

但没有任何改变。 你能帮我吗?我缺少什么? 非常感谢

除非您有非常充分的理由不这样做,否则我真的建议采用现代 Java EE 服务器并使用其提供的 JPA、事务管理和连接池。定义与服务器的连接并使用 JTA 事务(persistence.xml 中的 jta-data-source 标记)。另一种选择是将您的应用程序基于 Spring。如果你像你看起来那样去"low level",很多事情都会出错。如果您已经熟悉 Hibernate,我会选择 Wildfly,因为它以 Hibernate 作为其 JPA 提供程序。

最好通过外观 (EJB) 连接您的 UI 而不是 JPAContainer,如果您需要延迟加载的 Vaadin 容器,请使用例如来自 Viritin 或 Lazy Query Container 的 MTable。此 webinar and e.g. this example project 可能会帮助您入门。

如果你真的没有解决办法,只能使用低级别 "application managed JPA session management",你应该确保正确关闭你的 EntityManager 实例。我会为您的 UI class 创建一个辅助方法,returns 为您 UI 中的每个 jpacontainer 使用相同的 EntityManager。然后将 DetachListener 添加到您的 UI 并在那里关闭实体管理器。