springboot mybatisplus druid mysql怎么多主多从 读写分离
时间: 2023-10-09 12:15:27 浏览: 182
要实现多主多从,读写分离的功能,可以通过使用MybatisPlus和Druid来实现。下面是大致的步骤:
1. 首先需要配置多个数据源,分别对应主库和从库。可以在application.properties或application.yml中配置多个数据源。
2. 在SpringBoot的启动类中,使用@Primary注解指定默认的数据源。
3. 使用Druid来配置数据源,可以通过使用@DataSource注解来指定具体的数据源。
4. 配置MybatisPlus的分页插件和动态数据源插件。分页插件可以使用PaginationInterceptor类,动态数据源插件可以使用DynamicDataSourcePlugin类。
5. 在Mapper接口中,使用@Mapper注解来指定具体的Mapper类,同时使用@DataSource注解来指定具体的数据源。
6. 在Service层中,可以通过使用@Transactional注解来实现事务管理。
下面是一个简单的配置示例:
```java
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
public DataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(DynamicDataSourceEnum.MASTER.getValue(), masterDataSource);
targetDataSources.put(DynamicDataSourceEnum.SLAVE.getValue(), slaveDataSource);
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setTargetDataSources(targetDataSources);
dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
return dynamicDataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dynamicDataSource) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dynamicDataSource);
sqlSessionFactoryBean.setPlugins(new Interceptor[]{
new PaginationInterceptor(),
new DynamicDataSourcePlugin()
});
return sqlSessionFactoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
```
```java
public enum DynamicDataSourceEnum {
MASTER("master"),
SLAVE("slave");
private String value;
DynamicDataSourceEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
```
```java
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
public @interface DataSource {
DynamicDataSourceEnum value() default DynamicDataSourceEnum.MASTER;
}
```
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSource();
}
}
```
```java
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<DynamicDataSourceEnum> CONTEXT_HOLDER = new ThreadLocal<>();
public static void setDataSource(DynamicDataSourceEnum dataSource) {
CONTEXT_HOLDER.set(dataSource);
}
public static DynamicDataSourceEnum getDataSource() {
return CONTEXT_HOLDER.get();
}
public static void clearDataSource() {
CONTEXT_HOLDER.remove();
}
}
```
```java
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@DataSource(DynamicDataSourceEnum.MASTER)
@Override
public void addUser(User user) {
userMapper.insert(user);
}
@DataSource(DynamicDataSourceEnum.SLAVE)
@Override
public User getUser(Long id) {
return userMapper.selectById(id);
}
}
```
这样就可以实现多主多从,读写分离的功能了。
阅读全文