数据连接泄露是个很头疼的问题,框架Spring也提供了很多种办法来避免这个问题,比如使用Template,当然其背后是DataSourceUtils.这里还有另外一种办法,使用TransactionAwareDataSourceProxy.通过TransactionAwareDataSourceProxy对数据源进行代理后,数据源对象就有了事务上下文感知的能力了。看源码会发现,其实它还是使用的DataSourceUtils. 哈哈,是不是觉得其实是在围着一个原点打转?
这里只取一部分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也是类似的。
分享到:
相关推荐
由于`SimpleJdbcTemplate`继承自`JdbcOperations`接口,所以可以直接使用`TransactionAwareDataSourceProxy`来确保事务的正确性: ```java @Autowired private TransactionAwareDataSourceProxy dataSourceProxy; ...
同时,Spring JDBC支持事务,可以通过TransactionAwareDataSourceProxy包装数据源,使得在JdbcTemplate的使用过程中自动参与到Spring的事务管理中。 在思维导图"Spring Transaction.twd"中,可能包含了Spring事务...
11.3.6. TransactionAwareDataSourceProxy类 11.3.7. DataSourceTransactionManager类 11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. StoredProcedure...
11.3.6. TransactionAwareDataSourceProxy类 11.3.7. DataSourceTransactionManager类 11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. ...
11.3.6. TransactionAwareDataSourceProxy类 11.3.7. DataSourceTransactionManager类 11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. ...
1.2 关于SpringSource 1.3 Spring带给我们什么 1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性...
1.2 关于SpringSource 1.3 Spring带给我们什么 1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性...
11.3.6. TransactionAwareDataSourceProxy类 11.3.7. DataSourceTransactionManager类 11.3.8. NativeJdbcExtractor 11.4. JDBC批量操作 11.4.1. 使用JdbcTemplate进行批量操作 11.4.2. 使用SimpleJdbcTemplate...
11.3.6. TransactionAwareDataSourceProxy类 11.3.7. DataSourceTransactionManager类 11.3.8. NativeJdbcExtractor 11.4. JDBC批量操作 11.4.1. 使用JdbcTemplate进行批量操作 11.4.2. 使用SimpleJdbcTemplate...
All Classes AbstractAdvisorAutoProxyCreator AbstractApplicationContext AbstractApplicationEventMulticaster AbstractAspectJAdvice AbstractAspectJAdvisorFactory AbstractAspectJAdvisorFactory....
class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy" p:targetDataSource-ref="dataSource"/> <!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能--> p:...
Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................
Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................