一般我们在项目中配置数据源的时候基本上都是配一个数据库的链接地址,如果要读写分离,意味着要配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);
}
}