目录
- 场景
- 多数据源配置
- 引入Atomikos
- 测试service
1. 场景:
经常会碰到这种应用场景,比如说下订单的操作,有需要修改订单库中信息,又需要修改产品库中库存,这一个操作就是需要一次性操作两个数据源的情况,这种情况的事务控制可以使用Atomikos框架进行实现
2. 多数据源配置
参考:http://www.chengqj.com/info.html?id=33
3. 引入Atomikos
- 引入jar包
- 修改DataSourceConfig
3.1 引入jar包
implementation('org.springframework.boot:spring-boot-starter-jta-atomikos')
3.2 修改DataSourceConfig
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import javax.sql.DataSource;
import java.util.Properties;
/**
* @program: twodatasource
* @description: 数据源
* @author: chengqj
* @create: 2018-10-24 11:39
**/
@Configuration
public class DataSourceConfig {
@Bean(name = "ds1")
// application.properteis中对应属性的前缀
@ConfigurationProperties(prefix = "first.datasource")
public DataSource dataSource1(Environment env) {
AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
Properties prop = build(env, "first.datasource.");
ds.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
ds.setUniqueResourceName("ds1");
ds.setXaProperties(prop);
return ds;
}
@Bean(name = "ds2")
// application.properteis中对应属性的前缀
@ConfigurationProperties(prefix = "second.datasource")
public DataSource dataSource2(Environment env) {
AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
Properties prop = build(env, "second.datasource.");
ds.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
ds.setUniqueResourceName("ds2");
ds.setXaProperties(prop);
return ds;
}
private Properties build(Environment env, String prefix) {
Properties prop = new Properties();
prop.put("URL", env.getProperty(prefix + "jdbc-url"));
prop.put("user", env.getProperty(prefix + "username"));
prop.put("password", env.getProperty(prefix + "password"));
return prop;
}
}
4. 测试service
import com.chengqj.twodatasource.dao.entity.TClass;
import com.chengqj.twodatasource.dao.entity.Teacher;
import com.chengqj.twodatasource.service.TClassServiceImpl;
import com.chengqj.twodatasource.service2.TeacherServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.LinkedHashMap;
import java.util.Map;
@Service
public class JtaTestServiceImpl{
@Autowired
private TeacherServiceImpl teacherService;
@Autowired
private TClassServiceImpl tclassService;
@Transactional( propagation = Propagation.REQUIRED, rollbackFor = { RuntimeException.class })
public Map<String, Object> test01() {
LinkedHashMap<String,Object> resultMap=new LinkedHashMap<String,Object>();
TClass tClass=new TClass();
tClass.setId("23");
tClass.setName("8888");
tclassService.save(tClass);
Teacher teacher=new Teacher();
teacher.setId("23");
teacher.setName("8888");
teacherService.save(teacher);
System.out.println(1/0);
resultMap.put("state","success");
resultMap.put("message","分布式事务问题");
return resultMap;
}
}