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

8313

被折叠的 条评论
为什么被折叠?



