gpt4 book ai didi

java - JPAContainer 保持数据库的连接打开

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:45:12 25 4
gpt4 key购买 nike

我遇到了这个问题:使用 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 并将其绑定(bind)到一个表时,我会在 MSSQL Activity 监视器上看到我的新连接,但如果我的 session 超时或注销,我仍然会在 SQL 上看到该连接。

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

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

我已经尝试添加属性

<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 或 Lazy Query Container 的 MTable。这webinar和例如这个example project可能会帮助您入门。

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

关于java - JPAContainer 保持数据库的连接打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28564882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com