spring boot 实现mysql读写分离

时间:2022-05-06
本文章向大家介绍spring boot 实现mysql读写分离,主要内容包括如何实现读写分离呢?或者说实现一主多从?、创建主数据源、创建从数据源、使用示例:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

如何实现读写分离呢?或者说实现一主多从?

一般我们在项目中配置数据源的时候基本上都是配一个数据库的链接地址,如果要读写分离,意味着要配N个链接地址。

思路其实很简单,就是创建多个数据源,增删改用主库的数据源,查询用从库的即可。

在spring boot中我们需要配置这些数据源,如下:

spring.datasource.primary.url=jdbc:mysql://192.168.0.132:4306/test
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driverClassName=com.mysql.jdbc.Driver

spring.datasource.secondary.url=jdbc:mysql://192.168.0.132:4306/test1
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driverClassName=com.mysql.jdbc.Driver

创建主数据源

@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
//指定数据源配置前缀
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
    return DataSourceBuilder.create().build();
}

创建从数据源

@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@Primary //在同样的DataSource中,首先使用被标注的DataSource  
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
    return DataSourceBuilder.create().build();
}

我这边用JdbcTemplate来操作,所以配置2个JdbcTemplate类。要操作哪个数据库就用哪个JdbcTemplate。

@Bean(name = "primaryJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

@Bean(name = "secondaryJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

使用示例:

@Repository
public class UserRepository {

    @Autowired
    @Qualifier("primaryJdbcTemplate")
    protected JdbcTemplate primaryJdbcTemplate;

    @Autowired
    @Qualifier("secondaryJdbcTemplate")
    protected JdbcTemplate secondaryJdbcTemplate;

    public void save() {
        primaryJdbcTemplate.execute("insert into users(mobile) values('182182121')");
    }

    public Long queryCount() {
        return secondaryJdbcTemplate.queryForObject("select count(*) from users", Long.class);
    }

}

完整源码下载:http://cxytiandi.com/code/detail/23