springbott 实现读写分离
时间: 2024-05-12 13:19:27 浏览: 91
读写分离是指将数据库的读和写操作分别放到不同的数据库服务器上,以提高数据库的读写性能和并发能力。SpringBoot可以通过集成多个数据源来实现读写分离。
首先,在SpringBoot中配置多个数据源,在application.yml文件中配置:
```yaml
spring:
datasource:
master:
url: jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3307/db_slave?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
```
其中,配置了一个主数据源(master)和一个从数据源(slave),两个数据源连接的是不同的数据库服务器。
接着,在SpringBoot中配置读写分离,可以使用MyBatis-Plus提供的DynamicDataSource类来实现,具体配置如下:
```java
@Configuration
public class DataSourceConfig {
@Bean
public DynamicDataSource dataSource() {
Map<String, DataSource> targetDataSources = new HashMap<>();
DataSource master = DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=utf-8&useSSL=false")
.username("root")
.password("root")
.driverClassName("com.mysql.cj.jdbc.Driver")
.build();
DataSource slave = DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3307/db_slave?useUnicode=true&characterEncoding=utf-8&useSSL=false")
.username("root")
.password("root")
.driverClassName("com.mysql.cj.jdbc.Driver")
.build();
targetDataSources.put("master", master);
targetDataSources.put("slave", slave);
DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setTargetDataSources(targetDataSources);
dataSource.setDefaultTargetDataSource(master);
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory(DynamicDataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
return sessionFactory.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
```
在这个配置类中,首先创建了一个DynamicDataSource类的实例,并将主数据源和从数据源都添加到了targetDataSources中,并将主数据源设置为默认数据源。接着配置了SqlSessionFactory和SqlSessionTemplate,这里使用了Mybatis-Plus提供的MybatisSqlSessionFactoryBean类来创建SqlSessionFactory。
最后,在需要访问数据库的地方,使用注解@DS指定数据源即可,例如:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
@DS("master")
public void addUser(User user) {
userMapper.insert(user);
}
@Override
@DS("slave")
public User getUserById(int id) {
return userMapper.selectById(id);
}
}
```
在这个例子中,addUser方法使用了主数据源,getUserById方法使用了从数据源。通过@DS注解,可以让Spring动态切换数据源,从而实现读写分离。
阅读全文