Spring Boot 集成 Dynamic多数据源配置
基础配置添加
引入依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<!--dynamic-datasource-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.5</version>
</dependency>
其中 mysql-connector-java
,druid-spring-boot-starter
, mybatis-plus-boot-starter
为数据库基础配置数据。Spring Boot在1.X到2.X的版本过程中,说用HikariCP做为默认连接池,使用默认连接池,这边使用Duird替换原有连接池,实现数据监控与日志输出。
application.yml配置
server:
port: 8080
spring:
application:
name: spring-boot-demo
profiles:
active: druid
# MyBatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.windsoft.springboot.demo.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志
map-underscore-to-camel-case: true
# 该配置就是将带有下划线的表字段映射为驼峰格式的实体类属性
其中 profiles:
为标注拓展配置文件,这里将多数据源的配置文件独立出来做为单独的文件,方便管理
application-druid.yml
# 数据源配置
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/spring-boot-demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password:
slave:
url: jdbc:mysql://localhost:3306/spring-boot-demo-back?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password:
修改启动类配置
去除DruidDataSourceAutoConfigure的自动配置
@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class})
需要排除自动配置,否则会导致配置类在原始的配置文件中寻找数据库的配置属性,从而导致项目无法启动。
注解使用
@DS("slave")
默认不带注解使用master
数据源进行配置,注解中的名称为配置文件中多数据源的名称保持一致。
@DS("slave")
public Information search(int id) {
return informationMapper.selectById(id);
}
带有注解的 类 或 方法 会被多数多数据源进行托管,访问不同的数据源进行数据操作,其中,注解的作用范围遵循 类 > 方法的原则
手动事务开启
默认情况下 dynamic-datasource
不添加默认不添加事务管理器 DataSourceTransactionManager
需要手动添加管理类
其中dynamicDataSource
为dynamic的数据源名称,使用这个Bean名称进行注入
@Configuration
public class TransactionConfig{
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dynamicDataSource) {
return new DataSourceTransactionManager(dynamicDataSource);
}
}
手动事务启动方式
@Service
public class Test {
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
private TransactionDefinition transactionDefinition;
public void testTransaction(){
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
// 代码逻辑 ..
try {
System.out.println("事务代码");
// 手动提交
dataSourceTransactionManager.commit(transactionStatus);
} catch (Exception e) {
// 事务回滚
dataSourceTransactionManager.rollback(transactionStatus);
e.printStackTrace();
}
}
}