首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迫使hibernate在会话Spring上发布连接

问迫使hibernate在会话Spring上发布连接
EN

Stack Overflow用户
提问于 2013-06-11 09:28:41
回答 1查看 8.9K关注 0票数 1

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

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

这是我的spring-config代码

代码语言:javascript
复制
<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>

这是我的调试代码

调试myExec-2 -重新启用自动提交调试myExec-2提交的JDBC连接调试myExec-2 -积极释放JDBC连接调试myExec-2 -释放JDBC连接(打开PreparedStatements: 0,全局: 0) (打开ResultSets: 0,全局: 0)调试myExec-2 -在事务调试myExec-2之后关闭Hibernate会话org.hibernate.impl.SessionImpl@52ab7af2 -关闭Hibernate会话

但是在JProfiler中,我可以看到连接仍然与您看到的一样是打开的。

​

​

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-11 10:41:22

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

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

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

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

更新2:使用maxIdle的是个好主意,如果你不想摆脱池的话。但这并不能让你免于“非封闭联系”。如果您正在考虑设置maxIdle=0,那么完全放弃池。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17040743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档