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() 方法获取连接的效果是一样的。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 第326天
- Shell-Bash变量与运算符
- Activiti(一)SpringBoot2集成Activiti6
- 逻辑回归的理解与python示例
- Guava|Guava RateLimiter与限流算法
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题