4

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

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

http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="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 并将其绑定到表时,我会在 MSSQL 活动监视器上看到我的新连接,但如果我的会话超时或注销,我仍然会在 SQL 上看到连接。

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

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

我试图添加属性

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

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

4

1 回答 1

3

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

而不是 JPAContainer,最好通过外观 (EJB) 连接您的 UI,如果您需要延迟加载的 Vaadin 容器,请使用例如来自 Viritin 或 Lazy Query Container 的 MTable。此网络研讨会和例如此示例项目可能会帮助您入门。

如果您真的没有解决方案,只能使用低级别的“应用程序管理的 JPA 会话管理”,您应该确保正确关闭您的 EntityManager 实例。我会为您的 UI 类创建一个辅助方法,该方法为您 UI 中的每个 jpacontainer 返回相同的 EntityManager。然后将 DetachListener 添加到您的 UI 并在那里关闭实体管理器。

于 2015-02-18T10:44:11.390 回答