基于Spirngboot框架实现多数使用@DS注解实现的多数据源配置

需要的依赖

<!--数据层-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.6</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.23</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
<!--配置多数据源-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

这个配置文件真有说法

datasource:

dynamic:

druid 

这下面一大段的链接配置需要这么写 或许别的写法也可以 我只有这么写才启动成功了 德鲁伊连接池不配置 会起不来 然后数据库的配置格式也要和我的配置文件一样(注意空格)

  我数据库是sqlservice的     driver-class-name: 指定的驱动是  sqlservice的数据库  如果换数据库记得修改

 

 下面是是配置文件

server:
  port: 8080
spring:
  datasource:
    dynamic:
      druid:
        initial-size: 5
        min-idle: 5
        maxActive: 20
        # 配置获取连接等待超时的时间
        maxWait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        timeBetweenEvictionRunsMillis: 6000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        minEvictableIdleTimeMillis: 60000
        # 配置一个连接在池中最大生存的时间,单位是毫秒
        maxEvictableIdleTimeMillis: 900000
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
          url: jdbc:sqlserver://localhost:14333;database=dbname
          username: hello
          password: hello
        slave_1:
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
          url: jdbc:sqlserver://localhost:14333;database=dbname
          username: hello
          password: hello

 配置完成了  再创两个mapper 再使用@DS注解 指定 再配置文件中制定的 数据库连接名称 比如@DS(slave_1: ) 这个是指定数据库连接的  什么都不写就是 默认 调用这个mapper 执行操作都是针对master :主库的

package com.mapper;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.domain.CtpAttachment;
import org.apache.ibatis.annotations.Mapper;

//查找从库的库
@Mapper
@DS("slave_1")
public interface AttachmentMapper extends BaseMapper<DATA> {




}
package com.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import com.domain.*;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

//查找默认主的库
@Mapper
public interface MoveMapper extends BaseMapper<Data> {
}

!!!!!!!!!!!!!!!!!!!!!!!!最关键的点

service 调用mapper 的时候千万不要开启事务 估计是因为是两个数据库 所以不支持事务 

如果使用了  事务注解  那么 指定数据源 会直接失效

//@Transactional 开启之后  多数据源就会失效!
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
@DS注解是Dynamic DataSource Routing的缩写,可以实现动态数据源切换。它可以在方法或类上使用,用于指定使用哪个数据源。下面是一个使用@DS注解实现配置多数据源的示例: 1. 配置多个数据源 ```java @Configuration public class DataSourceConfig { @Bean(name = "dataSource1") @ConfigurationProperties(prefix = "spring.datasource.ds1") public DataSource dataSource1() { return DataSourceBuilder.create().build(); } @Bean(name = "dataSource2") @ConfigurationProperties(prefix = "spring.datasource.ds2") public DataSource dataSource2() { return DataSourceBuilder.create().build(); } } ``` 2. 定义数据源切换注解 ```java @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DS { String value() default "dataSource1"; } ``` 3. 配置数据源切换切面 ```java @Aspect @Component public class DynamicDataSourceAspect { @Pointcut("@annotation(com.example.demo.annotation.DS)") public void dsPointCut() { } @Around("dsPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { MethodSignature signature = (MethodSignature) point.getSignature(); DS ds = signature.getMethod().getAnnotation(DS.class); if (ds == null) { DynamicDataSourceContextHolder.setDataSourceKey("dataSource1"); } else { DynamicDataSourceContextHolder.setDataSourceKey(ds.value()); } try { return point.proceed(); } finally { DynamicDataSourceContextHolder.clearDataSourceKey(); } } } ``` 4. 在需要使用不同数据源的方法上使用@DS注解 ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @DS("dataSource1") @Override public User getUserById(int id) { return userMapper.getUserById(id); } @DS("dataSource2") @Override public User getUserByUsername(String username) { return userMapper.getUserByUsername(username); } } ``` 这样,在调用getUserById方法时会使用dataSource1数据源,调用getUserByUsername方法时会使用dataSource2数据源。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值