Spring与数据连接泄漏

本文探讨了Spring如何防止数据连接泄漏问题,通过模拟连接泄露情况,分析事务环境和无事务环境下数据连接的管理。重点讲解了TransactionAwareDataSourceProxy代理数据源的作用,以及在无事务场景下正确释放连接的方法。

Spring与数据连接泄漏

一、Spring对避免数据连接泄露问题的承诺

只要在程序中使用Spring Dao的模版(如 JdbcTemplate、HibernateTemplate等)进行数据访问,就一定不会存在数据连接泄露的问题。

二、模拟数据连接泄露

通过Connection conn =jdbcTemplate.getDataSource().getConnection()获取数据连接,使用完成后不主动还给数据源(调用Connection#close()方法),则将造成数据连接泄露的问题。代码示例

三、事务环境下,通过DataSourceUtils获取数据连接

通过DataSourceUtils.getConnection(DataSource dataSource)方法获取数据连接:首先查看当前是否存在事务上下文,并尝试从事务管理上下文中获取连接。如果获取失败,则直接从数据源中获取连接。在获取连接后,如果当前拥有事务上下文,则将连接绑定到事务上下文中。

因此,在事务环境下,通过DataSourceUtils获取数据连接,不会导致数据连接泄露。

四、无事务环境下,通过DataSourceUtils获取数据连接,仍会导致连接泄露

如果DataSourceUtils在没有事务上下文的方法中使用getConnection()方法获取连接,那么仍然会造成数据连接泄露。

要想堵上这个连接泄露,只需要现实的使用DataSourceUtils释放连接:

DataSourceUtils.releaseConnection(conn, jdbcTemplate.getDataSource());

五、TransactionAwareDataSourceProxy对数据源进行代理

通过 TransactionAwareDataSourceProxy 对数据源进行代理,数据源对象被代理后就具有了事务上下文感知对能力。
通过代理数据源对getConnection() 方法获取连接和使用 DataSourceUtils.getConnection() 方法获取连接的效果是一样的。

    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
        <property name="targetDataSource">
            <bean class="org.apache.commons.dbcp.BasicDataSource"
                  destroy-method="close"
                  p:driverClassName="${jdbc.driverClassName}"
                  p:url="${jdbc.url}"
                  p:username="${jdbc.username}"
                  p:password="${jdbc.password}"/>
        </property>
    </bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值