springBoot集成dynamic-datasource实现多数据源的读写

       我们在开发项目的时候,会遇到一些问题。比如在某个数据库实现读数据,某个数据库实现写数据。所以这个时候就需要使用多数据源的读写。所以使用dynamic-datasource来实现。接下来我们就介绍下如何使用。

1:引入jar包

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

2:在application.properties中添加相应的数据源

下面是比较简单的配置,复杂的可以参考参考链接。


### datasource begin ###


##设置默认的数据源或者数据源组,默认值为master
spring.datasource.dynamic.primary=master
#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
spring.datasource.dynamic.strict=false

###主库设置

spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/mfwow?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC

spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver



###从库设置
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://172.31.3.226:3306/Knowdege?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false

spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=YydhTest2019!226
spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.jdbc.Driver


###  datasource end ###

3:在启动类@SpringBootApplication注解中,添加排除原生Druid的配置类。

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class Bootstrap {

    private static Logger log= LoggerFactory.getLogger(Bootstrap.class);

    public static void main(String[] args)throws Exception {
        ConfigurableApplicationContext application = SpringApplication.run(Bootstrap.class, args);
        Environment env = application.getEnvironment();
        String ip = InetAddress.getLocalHost().getHostAddress();
        String port = env.getProperty("server.port");
        String path = env.getProperty("server.servlet.context-path");
        log.info("\n----------------------------------------------------------\n\t" +
                "Application dynamicTest is running! Access URLs:\n\t" +
                "Local: \t\thttp://localhost:" + port + path +"/swagger-ui.html"+ "\n\t" +
                "Inner: \thttp://" + ip + ":" + port + path  +"/swagger-ui.html"+ "\n\t" +
                "----------------------------------------------------------");
    }

}
在此说明下:为什么要排除DruidDataSourceAutoConfigure ? 

DruidDataSourceAutoConfigure会注入一个DataSourceWrapper,其会在原生的spring.datasource下找url,username,password等。而我们动态数据源的配置路径是变化的。

4:使用@DS切换数据源

在此说明下@DS只能在service和dao层使用,最好不要在controller层。如果没有标注,则是从master里操作数据。

Service层中添加@DS

@Service
public class SysUserService {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public List<Map<String, Object>> querySysUser() {
        return jdbcTemplate.queryForList("select * from sys_user");
    }

    @DS("slave")
    public List<Map<String, Object>> queryPromoterOrganizes() {
        return jdbcTemplate.queryForList("select * from promoter_organize");
    }

}

dao层

@Mapper
@DS("slave")
public interface SysUserMapper {

    @Insert("insert into user(`name`) values(#{name})")
    boolean addUser(@Param("name") String name);

    @Update("update user set name=#{name} where id=#{id}")
    boolean updateUser(@Param("id") Integer id, @Param("name") String name);


    @Delete("delete from user where id=#{id}")
    boolean deleteUser(@Param("id")Integer id);

    @Select(value = "select * from USER")
    List<User> selectUser();

}

参考:Spring boot整合dynamic-datasource实现多数据源的读写分离

          一个基于springboot的快速集成多数据源的启动器

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Dynamic Datasource 是一个用于在 Spring 框架中动态切换数据源的库。它可以让你在运行时动态地切换不同的数据源,而不需要重新启动应用程序。 使用 Spring Dynamic Datasource,你可以通过配置多个数据源,并在需要的时候通过代码切换到不同的数据源。这对于多租户系统、读写分离、数据分片等场景非常有用。 要使用 Spring Dynamic Datasource,首先需要在你的项目中引入相应的依赖。然后,你可以使用注解或者在配置文件中配置数据源信息,包括数据库连接信息、用户名、密码等。接下来,在需要切换数据源的地方使用 `DynamicDataSourceContextHolder` 来切换数据源。 例如,你可以在方法或者类上使用 `@DataSource` 注解来指定使用哪个数据源。代码示例: ```java @DataSource("dataSource1") public void doSomething() { // 使用 dataSource1 数据源进行操作 } @DataSource("dataSource2") public void doSomethingElse() { // 使用 dataSource2 数据源进行操作 } ``` 在这个例子中,`doSomething` 方法将使用 `dataSource1` 数据源,而 `doSomethingElse` 方法将使用 `dataSource2` 数据源。 除了注解方式外,你还可以在代码中直接调用 `DynamicDataSourceContextHolder.setDataSourceKey("dataSource1")` 来切换数据源。 需要注意的是,Spring Dynamic Datasource 需要与 Spring Boot 集成使用。你可以在 Spring Boot 的配置文件中配置数据源信息,并在需要的地方使用 `@DataSource` 注解来切换数据源。 希望这个回答能帮到你!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值