springboot druid 多数据源初始化

本文详细讲解了如何在SpringBoot项目中使用Druid实现多个数据源的初始化,重点讨论了@Primary注解的作用以及如何确保其他非@Primary数据源在项目启动时同步初始化。通过指定initMethod属性,解决了数据源延迟加载的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot druid 多数据源初始化

springboot druid 整合,项目初始化的时候只初始化了 Primary 数据源
	@Bean(name = "primaryDataSource")
    @Primary
    public DataSource primaryDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }
其他数据源在注入的时候并没有进行初始化,而是等到调用的时候才进行注入。
    @Bean(name = "secondaryDataSource")
    public DataSource secondaryDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

在服务调用的时候初始化了cluster数据源,druid源码显示druid 在获取连接的时候才进行数据源的初始化,而@Primary 注解的数据源在项目启动的时候会初始化数据源,@Primary注解 会从多个候选的实现中 选择有这个注解的bean 去注入
在这里插入图片描述

为了让其他数据源在项目初始化的时候也进行初始化,可以在其他数据源@Bean注解中指定initMethod,这样就可以在项目初始化的时候 也初始化其他的数据源了

    @Bean(name = "secondaryDataSource" inMethod="init")
    public DataSource secondaryDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }
### Spring BootDruid 多数据源配置与使用 在Spring Boot项目中,通过`@SpringBootConfiguration`可以创建自定义的配置类来管理多个数据源。为了实现多数据源的支持并利用Druid连接池的功能,需要完成几个主要部分的设置。 #### 配置文件中的多数据源设定 首先,在`application.yml`或`application.properties`里声明各个数据库的数据源属性: ```yaml spring: datasource: master: url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource slave: url: jdbc:mysql://localhost:3307/slave_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.DataSource type: com.alibaba.druid.pool.DruidDataSource ``` 上述配置指定了两个不同的MySQL实例作为主(`master`)和从(`slave`)数据源[^1]。 #### 创建动态数据源切换逻辑 接着编写一个用于管理和切换不同数据源的组件。这通常涉及到定义抽象基类以及具体的实现类来进行实际操作。 ```java @Configuration public class DataSourceConfig { @Bean(name = "masterDataSource") @Primary public DataSource masterDataSource(@Value("${spring.datasource.master.url}") String url, @Value("${spring.datasource.master.username}") String user, @Value("${spring.datasource.master.password}") String password, @Value("${spring.datasource.master.driver-class-name}") String driverClassName) { return createDataSource(url, user, password, driverClassName); } @Bean(name = "slaveDataSource") public DataSource slaveDataSource(@Value("${spring.datasource.slave.url}") String url, @Value("${spring.datasource.slave.username}") String user, @Value("${spring.datasource.slave.password}") String password, @Value("${spring.datasource.slave.driver-class-name}") String driverClassName) { return createDataSource(url, user, password, driverClassName); } private DataSource createDataSource(String url, String user, String password, String driverClassName){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(url); dataSource.setUsername(user); dataSource.setPassword(password); dataSource.setDriverClassName(driverClassName); // Additional configurations can be added here... return dataSource; } } ``` 这段代码展示了如何基于之前提到的应用程序属性初始化名为 `masterDataSource` 和 `slaveDataSource` 的bean对象,并指定它们为Druid类型的DataSource实例。 对于更复杂的场景下可能还需要考虑事务传播行为、读写分离策略等因素;而这些可以通过AOP切面编程或者其他方式进一步增强应用功能。 #### 动态路由到适当的数据源 最后一步是确保应用程序能够根据业务需求自动选择合适的数据源执行SQL查询或其他持久化层的操作。一种常见做法是在每次请求开始前决定好目标DS名称并通过ThreadLocal变量保存起来供后续调用链路访问。 ```java @Component public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); @Override protected Object determineCurrentLookupKey() { return contextHolder.get(); } public void setMaster(){ contextHolder.set("master"); } public void setSlave(){ contextHolder.set("slave"); } } ``` 此片段实现了继承自AbstractRoutingDataSource的一个子类DynamicDataSource,它负责维护当前线程上下文中所使用的具体数据源标识符(即'master' 或 'slave')。当有新的HTTP请求到来时,可以根据某些条件判断应该采用哪个DS,并相应地调整contextHolder内的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值