在Spring中使用JTA事务管理(二)
?
转载<bean id="jotm"class="org.springframework.transaction.jta.JotmFactoryBean"?/>①JOTM本地实例?
?②JTA事务管理器?
<bean id="txManager"class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction"?ref="jotm"?/>?②-1:指定userTransaction属性?
</bean>
③XAPool配置,内部包含了一个XA数据源,对应topicdb数据库?
<bean id="topicDS"class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
destroy-method="shutdown">
<property name="dataSource">
③-1:内部XA数据源?
<bean?class="org.enhydra.jdbc.standard.StandardXADataSource"
destroy-method="shutdown">
<property name="transactionManager"ref="jotm"?/>
<property name="driverName"value="com.MySQL.jdbc.Driver"?/>
<property name="url"value="jdbc:MySQL://localhost:3309/topicdb"?/>
</bean>
</property>
<property name="user"?value="root"?/>
<property name="password"value="1234"?/>
</bean>
④按照③相似的方式配置另一个XAPool,对应postdb数据库,?
<bean id="postDS"class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
destroy-method="shutdown">
<property name="dataSource">
<beanclass="org.enhydra.jdbc.standard.StandardXADataSource"
destroy-method="shutdown">
<property name="transactionManager"ref="jotm"?/>
<property name="driverName"value="com.mysql.jdbc.Driver"?/>
<property name="url"value="jdbc:mysql://localhost:3309/postdb"?/>
</bean>
</property>
<property name="user"?value="root"?/>
<property name="password"value="1234"?/>
</bean>
⑤配置访问topicDB数据源的Spring JDBC模板?
<bean id="topicTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"?ref="topicDS"?/>
</bean>
⑥配置访问postDB数据源的Spring JDBC模板?
<bean id="postTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"?ref="postDS"?/>
</bean>
⑦基于topicTemplate数据源的topicDao?
<bean id="topicDao"class="com.baobaotao.dao.jdbc.TopicJdbcDao">
<property name="jdbcTemplate"?ref="topicTemplate"?/>
</bean>
⑧基于postTemplate数据源的postDao?
<bean id="postDao"class="com.baobaotao.dao.jdbc.PostJdbcDao">
<property name="jdbcTemplate"?ref="postTemplate"?/>
</bean>
⑨进行跨数据库JTA事务的业务类?
<bean id="bbtForum"class="com.baobaotao.service.impl.BbtForumImpl">
<property name="topicDao"?ref="topicDao"?/>
<property name="postDao"ref="postDao"?/>
</bean>
⑩对BbtForumImpl业务类中的@Transaction注解进行驱动?
<tx:annotation-driven transaction-manager="txManager"?/>
????首先,我们在①处通过Spring所提供的JotmFactoryBean创建一个本地JOTM实例,该实例同时实现了??javax.transaction.UserTransaction和javax.transaction.TransactionManager接口,它可以和ObjectWeb的XAPool一起工作。
package com.baobaotao.service.impl;?
import org.springframework.transaction.annotation.Transactional;?
import com.baobaotao.dao.PostDao;?
import com.baobaotao.dao.TopicDao;?
import com.baobaotao.domain.Forum;?
import com.baobaotao.domain.Topic;?
import com.baobaotao.service.BbtForum;?
@Transactional ①事务注解,以便Spring动态织入事务管理功能?
public?class?BbtForumImpl implements BbtForum?{?
private?TopicDao topicDao;?
private?PostDao postDao;?
public?voidaddTopic(Topic topic) throws Exception?{ ②将方法将被施加JTA事务的增强?
topicDao.addTopic(topic);?
postDao.addPost(topic.getPost());?
}
}????BbtForumImpl将Dao类组织起来,PostDao和TopicDao分别访问不同数据库中表,通过Spring注解驱动事务切面的增强后,它们将工作于同一个JTA事务中。?