我遇到了这个问题:使用vaadin 7,我已经配置了我的persistence.xml,这里是代码
<?xml version="1.0" encoding="UTF-8"?>
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd” 版本= “2.0” &GT;
<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 Monitor上看到我的新连接,但如果我的会话超时或注销,我仍然会在SQL上看到连接。
如果我重新登录我的应用程序,并刷新表格,则会打开一个新连接,依此类推。
我的问题是我的sql服务器上有大量已打开的连接从未关闭。
我试图添加属性
<property name="hibernate.connection.release_mode" value="after_transaction" />
但没有改变。 你能帮我吗?我错过了什么? 非常感谢
答案 0 :(得分:3)
除非你有充分的理由不这样做,否则我真的建议采用现代Java EE服务器并使用其提供的JPA,事务管理和连接池。定义与服务器的连接并使用JTA事务(persistence.xml中的jta-data-source标记)。另一种选择是将您的应用程序基于Spring。如果你去低水平&#34;很多事情都可能出错。就像你似乎在做。如果你已经熟悉Hibernate,我选择Wildfly,因为它有Hibernate作为它的JPA提供者。
代替JPAContainer,最好通过外观(EJB)连接UI,如果需要延迟加载的Vaadin容器,请使用例如来自Viritin或Lazy Query Container的MTable。这个webinar和这个example project可能有助于您开始使用。
如果您确实没有解决方案,但要使用低级别的应用程序管理的JPA会话管理&#34;,则应确保正确关闭EntityManager实例。我为您的UI类创建一个辅助方法,为您的UI中的每个jpacontainer返回相同的EntityManager。然后将DetachListener添加到UI并关闭那里的实体管理器。