当前位置: 首页 > 知识库问答 >
问题:

强制Hibernate以释放会话 Spring MVC 上的连接

阙辰龙
2023-03-14

我使用SpringMVC3和Hibernate3.6,我使用xml配置的事务管理,我的代码工作得很好,但我的JDBC没有发布,尽管它说发布了。

我用JProfiler检查了一下,它说连接是打开的。

这是我的Spring配置代码

<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/parse_web?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="username" value="root" />
    <property name="password" value="miles106" />
    <property name="initialSize" value="5"/>
    <property name="maxActive" value="50000"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="ds" />
    <property name="mappingResources">
        <list>
            <value>com/mubasher/parsewebpage/entities/Changes.hbm.xml</value>
            <value>com/mubasher/parsewebpage/entities/Owners.hbm.xml</value>
            <value>com/mubasher/parsewebpage/entities/Ownerships.hbm.xml</value>
            <value>com/mubasher/parsewebpage/entities/TargetCompanies.hbm.xml</value>
            <value>com/mubasher/parsewebpage/entities/TempData.hbm.xml</value>
            <value>com/mubasher/parsewebpage/entities/Exceptions.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="hibernate.connection.useUnicode">true</prop>
            <prop key="hibernate.connection.characterEncoding">UTF-8</prop>
            <prop key="hibernate.connection.charSet">UTF-8</prop>
            <prop key="hibernate.connection.release_mode">after_statement</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

这是我的调试代码

DEBUG[myExec-2](JDBCTransaction.java:223)-重新启用自动提交DEBUG[myExec-2](JDBCTransaction.java:143)-已提交的JDBC连接DEBUG[myExec-2](ConnectionManager.java:427)-积极释放JDBC连接DEBUG[myExec-2](ConnectionManager.java:464)-释放JDBC连接[(打开准备语句:0,全局:0)(打开结果集:0,全局:0)]DEBUG[myExec-2](HibernateTransactionManager.java:734)-在事务DEBUG[myExec-2]后关闭Hibernate会话[org.hibernate.impl.SessionImpl@52ab7af2](SessionFactoryUtils.java:789)-关闭Hibernate会话

但是在JProfiler中,我可以看到连接仍然是打开的

这确实给我带来了问题,我的应用程序正在做大量的数据库工作,所以我需要在工作完成后立即关闭连接,我应该使用maxIdle吗?

共有1个答案

庾君博
2023-03-14

连接没有关闭,而是被重用。这就是commons-dbcp的全部目的,它代表数据库连接池。

建立新的连接通常是一个昂贵的操作。因此,DBCP所做的不是关闭连接,而是让它保持打开,并将其返回到连接池中以备他用。

如果您希望您的数据库连接在每次请求时关闭并重新打开,那么您需要使用不同的数据源(例如org.springframework.jdbc.datasource.简单驱动数据源)。

更新1:另请注意,在您的示例中,您将最大并行连接数(maxActive)设置为50000。这是一个极端的数字(默认值为8!!!),IMO可能会导致很多问题。

更新2:使用maxIdle是一个好主意,如果你不想摆脱池。但这并不能使您免于“拥有非封闭的连接”。如果您正在考虑设置 maxIdle=0,请完全删除池。

UPDAET 3:我只需要再次强调这一点 - 如果您需要 50000 个并行连接,那么您的代码确实有问题。

 类似资料:
  • 我将EclipseLink与JTA一起使用。当我使用WebLogic server版本(12.2.1.3.0)运行应用程序时,遇到了以下问题 PS-WebLogic版本(12.2.1.2.0)不面临此问题

  • 我正在使用macOS BigSur。我使用ssh隧道在远程机器上的gpu上运行脚本。由于进程很长,我正在使用,我希望在断开与的连接时,进程继续运行。但问题是,当ssh断开时,

  • 我改进了代码,以便从垃圾收集器中获得更好的结果。 现在,当我调用时,它确实释放了所有内存。但是,当我在不调用 的情况下观察内存使用情况时,应用程序确实会保留并使用越来越多的内存。 这是否意味着我的改进正在起作用,我的所有引用都是正确的,我可以忽略JVM是如何自己释放内存的。或者,我的代码中是否存在其他问题,这些问题是JVM在不运行垃圾收集器的情况下保留更多内存的原因。

  • C3P0不会在事务完成后释放连接。下面是堆栈跟踪: 池配置和事务配置如下: 如有任何建议,我将不胜感激

  • 组织。springframework。交易CannotCreateTransactionException:无法打开事务的Hibernate会话;嵌套的异常是java。lang.NoClassDefFoundError:org/hibernate/engine/transaction/spi/TransactionContext 我的POM文件 ============ SessionFactor

  • 我在学习冬眠时遇到了一个问题。我写了UnitTest和那里我尝试添加对象到DB。所有选择都正常工作,但插入不正常。 我也尝试过这样的东西 它引发了一个异常,事务没有成功启动,但它添加了用户 这里有一个例外 组织。springframework。交易TransactionSystemException:无法回滚Hibernate事务;嵌套的异常是org。冬眠TransactionException: