📄 common-datasource 多数据源使用
内部资料,请刷新扫码登录
pigcloud
本章文档对应视频 📺 22.动态数据源使用
# 动态数据源
pigx 的多数据配置,是基于 dynamic-datasource-spring-boot-starter (opens new window)实现,理论上支持此组件的全部功能。
注意动态数据源操作不要添加 @Transactional 注解,会导致数据源切换失效
# 如何使用
# 1. 业务服务引入动态数据源服务
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-datasource</artifactId>
</dependency>
# 2. 开启动态数据源
// 注意此注解方法在所有注解之上,单体架构放在 pigx-boot 模块 Main 方法上
@EnableDynamicDataSource
..
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
# 3. 配置数据源
# 方式一:YAML维护数据源 v5.7+
在微服务对应的配置文件中添加如下配置,如 nacos/pigx-upms-biz-dev.yaml
spring:
# 数据库相关配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid: # 主数据源 (原有的不需要修改)
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: 指向默认的 PIGX 数据库
dynamic: # 扩展的数据源
datasource:
ext1: # 扩展数据源1
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: 指向默认的扩展数据库1
druid:
proxy-filters: sqlLogFilter # 指定数据源SQL 打印
# 方式二:数据库配置数据源
创建 gen_datasource_conf 表,在 主数据源 创建数据源表,从数据库加载其他数据源信息 gen_datasource_conf
DROP TABLE IF EXISTS `gen_datasource_conf`;
CREATE TABLE `gen_datasource_conf` (
`id` bigint NOT NULL COMMENT '主键',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '别名',
`url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'jdbcurl',
`username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',
`password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
`tenant_id` bigint DEFAULT NULL COMMENT '租户ID',
`ds_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型',
`conf_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配置类型',
`ds_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库名称',
`instance` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '实例',
`port` int DEFAULT NULL COMMENT '端口',
`host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主机',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据源表';
# 4. 使用动态数据源查询
- Mapper 层
@Ds("#last")
固定写法,最后一个参数为指定数据源(必须有)
@Mapper
public interface DemoMapper extends BaseMapper<Demo> {
@DS("#last")
Map selectDs(String dsName);
}
- Service 层调用
@Service
public class DemoServiceImpl extends ServiceImpl<DemoMapper, Demo> implements DemoService {
@Override
public Object getByDs(Integer id) {
// 此处 dsName 为以上 gen_datasource_conf 加载数据源 name 字段
return baseMapper.selectDs("pigxx_core");
}
}
# 扩展使用
@DS("#session.tenantName")//从session获取
public List selectSpelBySession() {
return userMapper.selectUsers();
}
@DS("#header.tenantName")//从header获取
public List selectSpelByHeader() {
return userMapper.selectUsers();
}
@DS("#tenantName")//使用spel从参数获取
public List selectSpelByKey(String tenantName) {
return userMapper.selectUsers();
}
@DS("#user.tenantName")//使用spel从复杂参数获取
public List selecSpelByTenant(User user) {
return userMapper.selectUsers();
}