maonidou(苞米豆)团队针对springboot使用多数据源提供了一个启动器:dynamic-datasource-spring-boot-starter有兴趣的可以访问github了解详细. >> github地址
下面就简单说一下如何使用dynamic-datasource-spring-boot-starter为我们的spring boot添加多数据源
pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>
为@SpringBootApplication注解添加配置:
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
application.yml
spring:
datasource:
dynamic:
druid: #以下是全局默认值,可以全局更改
initial-size: 0
max-active: 8
min-idle: 2
max-wait: -1
min-evictable-idle-time-millis: 30000
max-evictable-idle-time-millis: 30000
time-between-eviction-runs-millis: 0
validation-query: select 1
validation-query-timeout: -1
test-on-borrow: false
test-on-return: false
test-while-idle: true
pool-prepared-statements: true
max-open-prepared-statements: 100
filters: stat,wall
share-prepared-statements: true
datasource:
master:
username: userName
password: password
url: url
driver-class-name: com.mysql.jdbc.Driver
druid:
initial-size: 5
slave:
username: userName
password: password
url: url
driver-class-name: com.mysql.jdbc.Driver
druid:
initial-size: 6
logging:
level:
com.baomidou: debug
以上简单的配置工程就已经能够使用多数据源了,下面编写两个Service进行测试(我这里用的mybatis plus)
//使用从库的service
public interface SlaveUserService extends IService<User> {
}
@Service
@DS("slave") //该注解标注在类上表示当前类所有方法都是操作slave库
public class SlaveUserServiceImpl extends ServiceImpl<UserDao, User> implements SlaveUserService {
}
//使用主库的service
public interface MasterUserService extends IService<User> {
}
@Service
@DS("master") //该注解标注在类上表示当前类所有方法都是操作master库
public class MasterUserServiceImpl extends ServiceImpl<UserDao, User> implements MasterUserService {
}
dao 代码:
public interface UserDao extends BaseMapper<User> {
}
使用controller进行测试(为了方便可以直写测试类)
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private MasterUserService masterUserService;
@Autowired
private SlaveUserService slaveUserService;
/**
* 多数据源测试 -- 分条件操作不同数据源
* @param name 名字
* @author kun
* @date 14:32 2018/10/23
*/
@RequestMapping(value = "/addOneUser")
public void addOneUser(@RequestParam("name") String name){
User user = new User();
user.setId(StringUtils.getUUID());
user.setName(name);
if (StringUtils.isChinese(name)) {
//中文名字存master库
masterUserService.save(user);
} else {
//非中文名字存slave库
slaveUserService.save(user);
}
}
}
启动之后url输入不同参数看多数据源是否起作用:
http://localhost:8088/user/addOneUser?name=kunkun
http://localhost:8088/user/addOneUser?name=锟锟
测试可用~
PS:
@DS注解可以标注在类上也可以标注在方法上,方法上的注解优先级大于类上的注解
@DS注解可以标注在service实现类上,也可以标注在dao接口上,可以通过自己项目的业务需要来选择.比如需要在controller里面就要区别使用哪个数据源我们就可以在service层使用@DS注解,如果我们在具体业务逻辑中才需要判断使用哪个库我们就可以将@DS注解标注在DAO接口上.
这里记录一个坑,当时在测试的时候,报一个缺少HttpSession的bean,这个问题是因为starter的版本导致的,当时使用的是2.3.0,后面修改为了2.3.2,然后springboot 版本用的2.0.5,就不报错了.