前言
实操项目过程中难免要配置多个数据源
例如 业务量↑ -> 数据库拆分/引入其他数据库 -> 配置多个数据源

多数据源配置方式
原始方式
- 自己通过在yml中配置多个数据库
- 自己创建多个DataSource
JdbcTemplate配置方式
- 引用不同的DataSource创建不同的JdbcTemplate
- 用到的时候引用不同的JdbcTemplate
mybatis配置方式
主要是使用注解指定数据源跟指定mapper对应的路径
@MapperScan(basePackages ="com.web.ds2..dao", sqlSessionTemplateRef = "ds2SqlSessionTemplate")
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/..路径..//.xml"));
dynamic-datasource
入门
- 引入dynamic-datasource-spring-boot-starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 配置数据源
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: username
password: password
driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://127.0.0.1:13306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: username
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
- 使用 @DS 切换数据源
/**
* 用户服务层
*/
public interface UserService {
List selectAll();
@DS("slave_1")
List selectByCondition();
}
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* 用户服务实现
*/
@Service
public class UserServiceImpl implements UserService {
@Resource
private JdbcTemplate jdbcTemplate;
@Override
public List selectAll() {
return jdbcTemplate.queryForList("select * from member");
}
@Override
@DS("slave_1")
public List selectByCondition() {
return jdbcTemplate.queryForList("select * from member where id < 10");
}
}
-
测试验证
selectAll

参考
额外资料
在typora中画流程的语句
graph LR;
业务量+-->数据库拆分/引入其他数据库;
数据库拆分/引入其他数据库-->配置多个数据源;

网友评论