目录 springmvc+mybatis多数据源分布式事务管理最近项目用到spring多数据源以进行数据整合,可是配置上事务时,发现数据源不能进行切换, 原因是因为事务是在connection层面管理的,启用事务后,一个事务内部的connection是复用的, 所以就算AOP切了数据源字符串,但是数据源并不会被真正修改,所以决定使用atomikos进行分布式事务的管理。pom依赖jta.properties把此配置文件放入classpath路径 项目启动会自动加载 不需进行配置 com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactorycom.atomikos.icatch.console_file_name = tm.outcom.atomikos.icatch.log_base_name = tmlog com.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tmcom.atomikos.icatch.console_log_level = INFO配置数据源为了测试这里配置2个数据源,大家可按自己项目情况配置。配置SQLSessionFactory指定mapper文件和实体所在路径配置MapperScanner指定dao文件所在包 并指定所用SQlSessionFactory配置Jta事务实体为了测试方便 这里2个数据源使用的是一个实体 publicclass Student { private Integer id; private String name; private Integer age; public Integer getId() { return id; } publicvoidsetId(Integer id) { this.id = id; } public String getName() { return name; } publicvoidsetName(String name) { this.name = name; } public Integer getAge() { return age; } publicvoidsetAge(Integer age) { this.age = age; } }dao这里两个mapper分别在配置MapperScanner配置的包体里 package com.fk.mapperOne; import com.fk.entity.Student; import org.springframework.stereotype.Repository; @Repository public interface StudentOneMapper { void insert(Student student); }package com.fk.mapperTwo; import com.fk.entity.Student; import org.springframework.stereotype.Repository; @Repository public interface StudentTwoMapper { void insert(Student student); }XMLservicepackage com.fk.service; import com.fk.entity.Student; @Service } Junit测试接下来使用junit进行测试 import com.fk.service.StudentServiceImpl; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { 'classpath:/spring/spring-mvc.xml', 'classpath:/spring/spring-mybatis.xml'}) public class StudentJunit { @Autowired private StudentServiceImpl studentService; @Test public void TestInsert(){ try { studentService.insert(); } catch (Exception e) { e.printStackTrace(); } } } 先测试下是否能插入数据完结分布式事务的内容就是这些了,由于本人初次接触分布式事务,有不足之处还请谅解并指出,谢谢! [完整Demo](http://git.oschina.net/monsterjava/fk_demo/tree/feature_fk/) |
|