Dynamic Datasource

Dynamic-Datasource是一款动态数据源的轻量级实现,封装成Spring Starter方式引入,支持Mybatis、MybatisPlus读写分离,支持通过注解动态切换切换数据源。

@DS:指定使用数据库跟配置文件中配置的对应,可以注解在方法上和类上,同时存在方法注解优先于类上注解,强烈建议注解在service实现或mapper接口方法上。

依赖

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>版本号</version>
</dependency>

配置文件,两个数据源,mysql和pgsql,三个库text、cca、gene_text

server:
  port: 8081
  address: 127.0.0.1

spring:
  application:
    name: template
  datasource:
    dynamic:
      # 默认数据库
      primary: master
      # 严格匹配数据源,默认false. true未匹配到指定数据源时抛异常
      strict: true
      datasource:
        text:
          url: jdbc:mysql://127.0.0.1:3306/text?characterEncoding=UTF-8&serverTimezone=GMT%2B8
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
        cca:
          url: jdbc:mysql://127.0.0.1:3306/cca?characterEncoding=UTF-8&serverTimezone=GMT%2B8
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
        geneText:
          url: jdbc:postgresql://127.0.0.1:5432/gene_text
          username: postgres
          password: postgres
          driver-class-name: org.postgresql.Driver

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:**/mapper/*.xml

text库中user表

@Data
@TableName("user")
public class User {

    @TableId
    private Integer uId;

    private String uName;

    private Integer uAge;

    private LocalDateTime uBirthDay;

    private Integer dId;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;
}

Mapper

@DS("text")
@Mapper
public interface UserMapper extends BaseMapper<User> {}

cca库中的config表

@Data
@TableName("config")
public class Config {

    @TableId
    private Integer configId;

    private String configName;

    private String configKey;
    
    private String configValue;
    
    private LocalDateTime createTime;
    
    private LocalDateTime updateTime;

}

Mapper

@DS("cca")
@Mapper
public interface ConfigMapper extends BaseMapper<Config> {}

 gene_text库中的call表

@Data
@TableName("call")
public class Call {

    @TableId
    private String partyId;

    private String dn;

    private String keyName;

    private String value;

    private LocalDateTime createTime;

}

Mapper

@DS("geneText")
@Mapper
public interface CallMapper extends BaseMapper<Call> {}

 使用,查询text库中的user表

@RestController
@RequestMapping("/template")
public class TemplateController extends BaseController{

    @Autowired
    private UserServiceImpl userService;

    @PostMapping("/queryTemplate")
    public ResponseResult queryTemplate(@RequestBody QueryReq queryReq) {
        return success(userService.queryTemplate(queryReq));
    }
}
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public Page<User> queryTemplate(QueryReq queryReq) {
        // 分页设置
        Page<User> userPage = Page.of(1, 10);

        // 查询条件设置
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        if (StrUtil.isNotBlank(queryReq.getName())) {
            queryWrapper.eq("u_name", queryReq.getName());
        }
        if (queryReq.getAge() != null) {
            queryWrapper.eq("u_age", queryReq.getAge());
        }
        if (queryReq.getCreateTime() != null && queryReq.getEndTime() != null) {
            queryWrapper.between("u_birth_day", queryReq.getCreateTime(), queryReq.getEndTime());
        }

        return userMapper.selectPage(userPage, queryWrapper);
    }
}

测试

查询geneText库call表

@RestController
@RequestMapping("/template")
public class TemplateController extends BaseController{

    @Autowired
    private CallServiceImpl callService;

    @GetMapping("/query")
    public ResponseResult query() {
        return success(callService.queryTemplate());
    }

}
@Service
public class CallServiceImpl implements CallService {

    @Autowired
    private CallMapper callMapper;

    @Override
    public Page<Call> queryTemplate() {
        // 分页设置
        Page<Call> callPage = Page.of(1, 10);

        // 查询条件设置
        QueryWrapper<Call> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("dn", "6001");

        return callMapper.selectPage(callPage, queryWrapper);
    }
}

测试

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mybatis dynamic datasource 提供了负载平衡的解决方案。通过使用 dynamic-datasource-spring-boot-starter,你可以轻松地集成多个数据源,并实现负载均衡。 在 dynamic-datasource 中,你可以配置多个数据源,并将它们分组。每个数据源都有一个权重值,用于控制负载均衡的分配。当你执行数据库操作时,dynamic-datasource 会根据权重值选择一个数据源来执行操作,从而实现负载均衡。 以下是一个使用 dynamic-datasource 实现负载平衡的示例: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource slaveDataSource() { return DataSourceBuilder.create().build(); } @Bean public DynamicDataSource dynamicDataSource(DataSource masterDataSource, DataSource slaveDataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put("master", masterDataSource); targetDataSources.put("slave", slaveDataSource); DynamicDataSource dynamicDataSource = new DynamicDataSource(); dynamicDataSource.setTargetDataSources(targetDataSources); dynamicDataSource.setDefaultTargetDataSource(masterDataSource); return dynamicDataSource; } @Bean public SqlSessionFactory sqlSessionFactory(DynamicDataSource dynamicDataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dynamicDataSource); return sessionFactory.getObject(); } @Bean public PlatformTransactionManager transactionManager(DynamicDataSource dynamicDataSource) { return new DataSourceTransactionManager(dynamicDataSource); } } ``` 在上述示例中,我们配置了两个数据源:master 和 slave。然后,我们使用 DynamicDataSource 将这两个数据源组合起来,并设置 master 数据源为默认数据源。这样,当执行数据库操作时,dynamic-datasource 会根据权重值选择一个数据源来执行操作。 请注意,上述示例中的配置是基于 Spring Boot 的,你需要根据自己的项目配置进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值