Spring与数据连接泄漏

Spring与数据连接泄漏
文章目录

  • Spring与数据连接泄漏
    • 一、Spring对避免数据连接泄露问题的承诺
    • 二、模拟数据连接泄露
    • 三、事务环境下,通过`DataSourceUtils`获取数据连接
    • 四、无事务环境下,通过`DataSourceUtils`获取数据连接,仍会导致连接泄露
    • 五、`TransactionAwareDataSourceProxy`对数据源进行代理

一、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对数据源进行代理 【Spring与数据连接泄漏】通过 TransactionAwareDataSourceProxy 对数据源进行代理,数据源对象被代理后就具有了事务上下文感知对能力。
通过代理数据源对getConnection() 方法获取连接和使用 DataSourceUtils.getConnection() 方法获取连接的效果是一样的。

    推荐阅读