1

我正在使用 Spring MVC 3 和 Hibernate 3.6,我使用 xml 配置的事务管理,我的代码工作得很好,但是我的 JDBC 没有发布,尽管它说它确实发布了。

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

这是我的弹簧配置代码

<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 Connection DEBUG [myExec-2] (ConnectionManager.java:427) - 积极释放 JDBC 连接 DEBUG [myExec-2] (ConnectionManager.java:464) - 释放 JDBC 连接 [ (open PreparedStatements: 0, global: 0) (open ResultSets: 0, global: 0)] DEBUG [myExec-2] (HibernateTransactionManager .java:734) - 在事务调试 [myExec-2] (SessionFactoryUtils.java:789) 之后关闭休眠会话 [org.hibernate.impl.SessionImpl@52ab7af2] - 关闭休眠会话

但是在 JProfiler 我可以看到连接仍然是打开的,如你所见

在此处输入图像描述

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

4

1 回答 1

5

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

建立新连接通常是一项昂贵的操作。所以 DBCP 所做的是,它不是关闭连接,而是让它保持打开状态并将其返回到连接池以供其他用途。

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


更新 1:另请注意,在您的示例中,您将最大并行连接maxActive

更新 2:maxIdle如果您不想摆脱池,使用是一个好主意。但这不会使您免于“具有非关闭连接”。如果您正在考虑设置maxIdle=0,请完全放弃池。

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

于 2013-06-11T10:41:22.767 回答