读书人

Spring-JDBC/ORM 一致事物管理解决方案

发布时间: 2013-03-21 10:08:17 作者: rapoo

Spring-JDBC/ORM 统一事物管理解决方案

?参加Spring源码:

?

SessionFactory org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory() throws Exception

?

第三种:使用被代理的数据源:

?

使用 TransactionAwareDataSourceProxy

如果不得已要显式获取数据连接,除了使用 DataSourceUtils 获取事务上下文绑定的连接外,还可以通过 TransactionAwareDataSourceProxy 对数据源进行代理。数据源对象被代理后就具有了事务上下文感知的能力,通过代理数据源的 getConnection() 方法获取的连接和使用 DataSourceUtils.getConnection() 获取连接的效果是一样的。

下面是使用 TransactionAwareDataSourceProxy 对数据源进行代理的配置:


清单 11.applicationContext.xml:对数据源进行代理

public void setDataSource(DataSource dataSource) { if(dataSource instanceof TransactionAwareDataSourceProxy) this.dataSource = ((TransactionAwareDataSourceProxy)dataSource).getTargetDataSource(); else this.dataSource = dataSource; }

?

及:?void org.springframework.orm.jpa.JpaTransactionManager.setDataSource(DataSource dataSource)

?

对于 Hibernate 的?sessionFactory?取得的所有的实际数据库连接皆取自于?

Connection?org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourcedataSource) throws?SQLException

?

而就是这个方法保证了取得的数据库连接 是 绑定到当前线程的真正数据库连接.

?

对于MyBatis官方文档中就是 使用 JDBC事务管理器便能够管理事务,则

?

只要 数据库被代理了,且使用的是 JDBC事务管理器则能够保证事务的一致性,

?

?

?另参见Hibernate配置:void org.springframework.orm.hibernate3.AbstractSessionFactoryBean.setUseTransactionAwareDataSource(boolean useTransactionAwareDataSource)

和?http://www.blogjava.net/i369/articles/194855.html

但JPA事务管理器取得的数据库连接也是?DataSourceUtils.doGetConnection 取得的连接

读书人网 >其他数据库

热点推荐