关于TransactionAwareDataSourceProxy 博客分类: Spring4.X spring
程序员文章站
2024-02-10 11:53:16
...
数据连接泄露是个很头疼的问题,框架Spring也提供了很多种办法来避免这个问题,比如使用Template,当然其背后是DataSourceUtils.这里还有另外一种办法,使用TransactionAwareDataSourceProxy.通过TransactionAwareDataSourceProxy对数据源进行代理后,数据源对象就有了事务上下文感知的能力了。看源码会发现,其实它还是使用的DataSourceUtils. 哈哈,是不是觉得其实是在围着一个原点打转?
这里只取一部分TransactionAwareDataSourceProxy源码来看看,如下。看到这里明白了吧。
然后看看在beans.xml中的配置,配置很简单,就一个引用,如下:
配好了后,在代码中使用如下:
还可以通过代理对象的getConnection()方法来获取事务上下文中绑定的数据连接。注意下面的源码。是不是看到了事务同步管理器的身影?
这里就说为什么可以避免连接泄露。
这里用的BasicDataSource,其他DataSource也是类似的。
这里只取一部分TransactionAwareDataSourceProxy源码来看看,如下。看到这里明白了吧。
Connection actualTarget = this.target; if(actualTarget == null) { actualTarget = DataSourceUtils.doGetConnection(this.targetDataSource); }
然后看看在beans.xml中的配置,配置很简单,就一个引用,如下:
<bean id="originalDataSource" 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}"/> <!-- 对数据源进行代理, 使数据源具有事务上下文感知能力--> <bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy" p:targetDataSource-ref="originalDataSource"/>
配好了后,在代码中使用如下:
//使用TransactionAwareDataSourceProxy对数据源进行代理, 使数据源具有事务上下文感知能力 TransactionAwareDataSourceProxy dataSourceProxy = (TransactionAwareDataSourceProxy) ctx.getBean("dataSource"); //通过代理对象来获取数据源对象。 BasicDataSource basicDataSource = (BasicDataSource) dataSourceProxy.getTargetDataSource();
还可以通过代理对象的getConnection()方法来获取事务上下文中绑定的数据连接。注意下面的源码。是不是看到了事务同步管理器的身影?
protected boolean shouldObtainFixedConnection(DataSource targetDataSource) { return !TransactionSynchronizationManager.isSynchronizationActive() || !this.reobtainTransactionalConnections; }
这里就说为什么可以避免连接泄露。
这里用的BasicDataSource,其他DataSource也是类似的。
推荐阅读
-
关于TransactionAwareDataSourceProxy 博客分类: Spring4.X spring
-
Spring异常之------初始化Aplicationcontext异常,"javax.ejb.Asynchronous"'s signer informat 博客分类: Spring异常 spring异常
-
关于@RestController和@Controller 博客分类: Spring4.X spring
-
Spring FactoryBean理解 博客分类: Spring4.X
-
关于Spring一个配置问题的解决noHandlerFound 博客分类: Spring Java WebSpringnoHandlerFound
-
关于聊天的一些技巧和精髓 博客分类: 生活与随想
-
关于生命 博客分类: 生活与随想
-
spring boot项目相关配置 博客分类: 编程语言 spring-boot
-
spring boot项目相关配置 博客分类: 编程语言 spring-boot
-
关于php cron任务管理的实现假想 博客分类: vb2005xu发发牢骚vb2005xu自己动手系列FleaPHP/QEEPHP 资料 php脚本