1.pom.xml文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
<resources>
<!--打包时打包mapper.xml文件-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*Mapper.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
2.application.yaml文件
server:
port: 8088
## 配置数据源相关信息
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
## 连接池配置
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
master:
## 数据源one配置
url: jdbc:mysql://localhost:3306/master?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
## 数据源two配置
url: jdbc:mysql://localhost:3306/slave?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
druid: #druid监控页面用户名和密码
name: admin
pass: sailing123
## 该配置节点为独立的节点
mybatis:
mapper-locations: classpath*:com/pb/modules/master/*.xml,classpath*:com/pb/modules/slave/*.xml
##打印sql日志
logging:
level:
##mapper包路径
com.pb.modules.master: debug
3.数据源配置
3.1主要数据源配置
@ConfigurationProperties(prefix = "spring.datasource.druid.master")
@Data
@Component("masterDbConfig")
public class MasterDbConfig {
private String url;
private String username;
private String password;
private String driverClassName;
}
3.2次数据源配置
@ConfigurationProperties(prefix = "spring.datasource.druid.slave1")
@Data
@Component("slave1DbConfig")
public class Slave1DbConfig {
private String url;
private String username;
private String password;
private String driverClassName;
}
3.3整合数据源配置
@MapperScans(
{
@MapperScan(basePackages = "com.pb.modules.master", sqlSessionTemplateRef = "masterSqlSessionTemplate"),
@MapperScan(basePackages = "com.pb.modules.slave", sqlSessionTemplateRef = "slave1SqlSessionTemplate")
}
)
@Configuration
public class MultipleDatasource {
// 配置数据源
@Primary
@Bean(name = "masterDataSource")
public DataSource testDataSource(@Qualifier("masterDbConfig") MasterDbConfig masterDbConfig) throws SQLException {
// 创建MYsql实现XA规范的分布式数据源
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
// 设置连接信息
mysqlXaDataSource.setUrl(masterDbConfig.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(masterDbConfig.getPassword());
mysqlXaDataSource.setUser(masterDbConfig.getUsername());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
// 数据源改为Atomikos,将事务交给Atomikos统一管理
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("masterDataSource");
return xaDataSource;
}
@Bean(name = "masterSqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//此处指定别名,不知为何在配置文件中指定别名无效,所以在这里指定
bean.setTypeAliasesPackage("com.pb.entity");
return bean.getObject();
}
@Bean(name = "masterSqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "slave1DataSource")
public DataSource slave1DataSource(@Qualifier("slave1DbConfig")Slave1DbConfig slave1DbConfig) throws SQLException {
// 创建MYsql实现XA规范的分布式数据源
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
// 设置连接信息
mysqlXaDataSource.setUrl(slave1DbConfig.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(slave1DbConfig.getPassword());
mysqlXaDataSource.setUser(slave1DbConfig.getUsername());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
// 数据源改为Atomikos,将事务交给Atomikos统一管理
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("slave1DataSource");
return xaDataSource;
}
@Bean(name = "slave1SqlSessionFactory")
public SqlSessionFactory slave1SqlSessionFactory(@Qualifier("slave1DataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean(name = "slave1SqlSessionTemplate")
public SqlSessionTemplate slave1SqlSessionTemplate(
@Qualifier("slave1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
4创建实体
@Data
public class Master {
private Long id;
private String name;
}
5创建Mapper及其xml文件
public interface MasterMapper {
void insertMaster(Master master);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pb.modules.master.MasterMapper" >
<insert id="insertMaster" parameterType="master">
insert into master(name) values (#{name})
</insert>
</mapper>
public interface SlaveMapper {
void insertSlave(Master master);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pb.modules.slave.SlaveMapper" >
<insert id="insertSlave" parameterType="com.pb.entity.Master">
insert into slave(name) values (#{name})
</insert>
</mapper>
6.创建Service
@Service
@Transactional//事务注解
public class CommonService {
@Autowired
MasterMapper masterMapper;
@Autowired
SlaveMapper slaveMapper;
public void insert(){
Master master = new Master();
master.setName("测试名字");
masterMapper.insertMaster(master);
//inc c = 10/0;
slaveMapper.insertSlave(master);
// int c = 10/0;
}
}
7.测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MultipleApplication.class)
public class MutipleTest {
@Autowired
CommonService commonService;
@Test
public void testServcie(){
commonService.insert();
}
}
到此,整个搭建过程完成。项目的目录结构如图: