[英]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“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" />
但沒有改變。 你能幫我嗎? 我錯過了什么? 非常感謝
除非你有充分的理由不這樣做,否則我真的建議采用現代Java EE服務器並使用其提供的JPA,事務管理和連接池。 定義與服務器的連接並使用JTA事務(persistence.xml中的jta-data-source標記)。 另一種選擇是將您的應用程序基於Spring。 如果你像你似乎正在做的那樣“低水平”,很多事情都可能出錯。 如果你已經熟悉Hibernate,我會選擇Wildfly,因為它有Hibernate作為它的JPA提供者。
而不是JPAContainer最好通過外觀(EJB)連接您的UI,如果您需要延遲加載的Vaadin容器,請使用例如來自Viritin的MTable或Lazy Query Container。 此網絡研討會和此示例項目可能有助於您開始使用。
如果您真的沒有解決方案,但要使用低級“應用程序管理的JPA會話管理”,則應確保正確關閉EntityManager實例。 我將為您的UI類創建一個輔助方法,為您的UI中的每個jpacontainer返回相同的EntityManager。 然后將DetachListener添加到UI並關閉實體管理器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.