springboot-双数据源配置

本文介绍了在SpringBoot中实现双数据源配置的详细步骤,以解决高并发场景下数据库读写压力问题。通过创建数据源枚举、数据源切换切面、动态数据源类等,实现了不同业务数据源的自动切换,确保了应用的稳定运行。
摘要由CSDN通过智能技术生成
先说下大背景--用户数据交互数据业务数据都在同一个数据库上,当有时效的活动比如榜单结束的时候大量用户开始刷排名,导致数据库读写同步压力过大,数据延迟从而产生错误的排名;
当时对大数据表已经做了分表处理而且加了缓存,千人榜乃至万人榜的榜单结束是伴随着大量的计算,数据插入,消息推送;mysql IO瞬间就飙到60M;所以在不改变线上系统稳定运行的前提下把用户交互数据移出去。
springboot双数据库的例子网上有很多,但是不同的场景就有不同的处理方式。
直接上干货:
双数据源配置主要以下几个类:
/**
 * Created by lixb on 2018/1/27.
 * 多数据源数据库类型
 *  app基本库
 *  社交库
 *  消息库 等
 */
public enum DataSourceType {
    db_app, //默认app
    ab_msg //社交库
}
/**
 * Created by lixb on 2018/1/26.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({
        ElementType.METHOD
})
public @interface DS {
    DataSourceType value() default DataSourceType.db_app;
}
/**
 * Created by lixb on 2018/1/26.
 */
public class DatabaseContextHolder {


    private static final ThreadLocal<DataSourceType> contextHolder = new ThreadLocal<>();
    // 设置数据源名
    public static void setDB(DataSourceType dbType) {
        contextHolder.set(dbType);
    }

    // 获取数据源名
    public static DataSourceType getDB() {
        return (contextHolder.get());
    }

    // 清除数据源名
    public static void clearDB() {
        contextHolder.remove();
    }
}
/**
 * Created by lixb on 2018/1/26.
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DatabaseContextHolder.getDB();
    }
}
/** 切面控制切换数据源
 * Created by lixb
在Spring Boot中配置多个数据源可以通过创建多个DataSource Bean并在每个Bean上使用@Qualifier注释来实现。以下是一个简单的数据源配置示例: 1. 在application.properties文件中配置两个数据源的连接信息: ``` # Primary datasource spring.datasource.url=jdbc:mysql://localhost:3306/db1 spring.datasource.username=user1 spring.datasource.password=pass1 spring.datasource.driver-class-name=com.mysql.jdbc.Driver # Secondary datasource spring.second-datasource.url=jdbc:mysql://localhost:3306/db2 spring.second-datasource.username=user2 spring.second-datasource.password=pass2 spring.second-datasource.driver-class-name=com.mysql.jdbc.Driver ``` 2. 创建两个数据源的Bean: ```java @Configuration public class DataSourceConfig { @Bean @Primary @ConfigurationProperties(prefix="spring.datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix="spring.second-datasource") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } } ``` 在这里,我们使用了@ConfigurationProperties注释来自动装配数据源的属性,因此不必在Java代码中硬编码它们。 3. 创建两个JdbcTemplate Bean,并将它们与对应的数据源Bean关联起来: ```java @Configuration public class JdbcTemplateConfig { @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean(name = "secondJdbcTemplate") public JdbcTemplate secondJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } } ``` 在这里,我们使用了@Qualifier注释来区分两个数据源Bean,并且将其传递给JdbcTemplate Bean。 现在,我们已经成功地配置了两个数据源。要在代码中使用它们,请注入相应的JdbcTemplate Bean,如下所示: ```java @Autowired private JdbcTemplate jdbcTemplate; @Autowired @Qualifier("secondJdbcTemplate") private JdbcTemplate secondJdbcTemplate; ``` 您现在可以使用jdbcTemplate和secondJdbcTemplate执行操作,以便在两个不同的数据库中存储和检索数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值