springBoot学习笔记切换数据源
Posted 拐柒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springBoot学习笔记切换数据源相关的知识,希望对你有一定的参考价值。
springBoot学习笔记(六)切换数据源
切换数据源
代码实现
实体bean
package com.lagou.pojo;
import lombok.Data;
@Data
public class Product {
private Integer id;
private String name;
private double price;
}
ProductMapper
public interface ProductMapper {
@Select("select * from product")
public List<Product> findAllMaster();
@Select("select * from product")
public List<Product> findAllSlave();
}
ProductService
@Service
public class ProductService {
@Autowired
ProductMapper productMapper;
public void findAllM(){
List<Product> allMaster = productMapper.findAllMaster();
for (Product product : allMaster) {
System.out.println(product);
}
}
public void findAllS(){
List<Product> allMaster = productMapper.findAllSlave();
for (Product product : allMaster) {
System.out.println(product);
}
}
}
ProductController
@RestController
public class ProductController {
@Autowired
ProductService productService;
@RequestMapping("findAllM")
@RoutingWith("master")
public String findAllProM(){
// RoutingDataSourceContext master = new RoutingDataSourceContext("master");
productService.findAllM();
return "master";
}
@RequestMapping("findAllS")
@RoutingWith("slave")
public String findAllProS(){
// RoutingDataSourceContext master = new RoutingDataSourceContext("slave");
productService.findAllS();
return "slave";
}
}
配置文件
# 数据库连接配置
spring.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.master.jdbc-url=jdbc:mysql:///product_master? useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.master.username=root
spring.datasource.master.password=root
spring.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.slave.jdbc-url=jdbc:mysql:///product_slave?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.slave.username=root
spring.datasource.slave.password=root
MyDataSourceConfiguratioin
@Configuration
public class MyDataSourceAutoConfiguration {
Logger logger = LoggerFactory.getLogger(MyDataSourceAutoConfiguration.class);
//master
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource(){
logger.info("master ................... dataSource");
return DataSourceBuilder.create().build();
}
//slave
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource(){
logger.info("slave ................... dataSource");
return DataSourceBuilder.create().build();
}
@Bean
@Primary
public DataSource primaryDataSource(
@Autowired @Qualifier("masterDataSource")DataSource masterDataSource,
@Autowired @Qualifier("slaveDataSource")DataSource slaveDataSource
){
RoutingDataSource routingDataSource = new RoutingDataSource();
Map<Object, Object> map = new HashMap<>();
map.put("master",masterDataSource);
map.put("slave",slaveDataSource);
routingDataSource.setTargetDataSources(map);
return routingDataSource;
}
}
RoutingDataSource
public class RoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return RoutingDataSourceContext.getDataSourceRoutingKey();
}
}
RoutingDataSourceContext
public class RoutingDataSourceContext {
static final ThreadLocal<String> threadLocal=new ThreadLocal<>();
//指定数据源类型
public RoutingDataSourceContext(String key) {
threadLocal.set(key);
}
public static String getDataSourceRoutingKey(){
String s = threadLocal.get();
return s==null?"master":s;
}
public void close(){
threadLocal.remove();
}
}
DruidConfig
@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource(){
return new DruidDataSource();
}
}
RoutingAspect
@Aspect
@Component
public class RoutingAspect {
@Around("@annotation(routingWith)")
public Object routingDataSource(ProceedingJoinPoint joinPoint,RoutingWith routingWith) throws Throwable {
String value = routingWith.value();
RoutingDataSourceContext master = new RoutingDataSourceContext(value);
return joinPoint.proceed();
}
}
RoutingWith
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RoutingWith {
String value() default "master";
}
Springboot03DataaccessApplication
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@MapperScan("com.lagou.mapper")
public class Springboot03DataaccessApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot03DataaccessApplication.class, args);
}
}
以上是关于springBoot学习笔记切换数据源的主要内容,如果未能解决你的问题,请参考以下文章