SpringBoot自定义注解使用读写分离Mysql数据库的实例教程
需求场景
为了防止代码中有的SQL慢查询,影响我们线上主数据库的性能。我们需要将sql查询操作切换到从库中进行。为了使用方便,将自定义注解的形式使用。
mysql导入的依赖
mysql mysql-connector-java 8.0.16
代码实现
配置文件
application.yml
spring: datasource: master: username:root password:123456 jdbc-url:jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 driver-class-name:com.mysql.cj.jdbc.Driver slave: username:root password:123456 jdbc-url:jdbc:mysql://localhost:3306/slave?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 driver-class-name:com.mysql.cj.jdbc.Driver
DataSourceType
/**
*数据源类型枚举
*@authoryangjc01
*@create2020/11/02
*/
publicenumDataSourceType{
/**
*主库,主要进行写操作
*/
MASTER,
/**
*从库,进行读操作
*/
SLAVE
}
DynamicDataSource
/**
*动态数据源
*@authoryangjc01
*@create2020/11/02
*/
publicclassDynamicDataSourceextendsAbstractRoutingDataSource{
publicDynamicDataSource(DataSourcedefaultTargetDataSource,
Map
DynamicDataSourceContextHolder
publicclassDynamicDataSourceContextHolder{
/**
*使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
*所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
*/
privatestaticfinalThreadLocalCONTEXT_HOLDER=
newThreadLocal<>();
/**
*设置数据源的变量
*/
publicstaticvoidsetDateSourceType(StringdsType){
CONTEXT_HOLDER.set(dsType);
}
/**
*获得数据源的变量
*/
publicstaticStringgetDateSourceType(){
returnCONTEXT_HOLDER.get();
}
/**
*清空数据源变量
*/
publicstaticvoidclearDateSourceType(){
CONTEXT_HOLDER.remove();
}
}
DataSource注解
/**
*@authoryangjc01
*@create2020/11/01
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceDataSource{
/**
*切换数据源
*/
DataSourceTypevalue()defaultDataSourceType.MASTER;
}
DataSourceAspect切面
@Aspect
@Order(1)
@Component
publicclassDataSourceAspect{
@Pointcut("@annotation(com.jgame.mis.annotation.DataSource)")
publicvoiddsPointCut(){
}
@Around("dsPointCut()")
publicObjectaround(ProceedingJoinPointpoint)throwsThrowable{
MethodSignaturesignature=(MethodSignature)point.getSignature();
Methodmethod=signature.getMethod();
DataSourcedataSource=method.getAnnotation(DataSource.class);
if(null!=dataSource){
DynamicDataSourceContextHolder.
setDateSourceType(dataSource.value().name());
}
try{
returnpoint.proceed();
}finally{
//销毁数据源在执行方法之后
DynamicDataSourceContextHolder.clearDateSourceType();
}
}
}
DataSourceConfig
@Configuration
publicclassDataSourceConfig{
@Bean
@ConfigurationProperties("spring.datasource.master")
publicDataSourcemasterDataSource(){
returnDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.slave")
publicDataSourceslaveDataSource(){
returnDataSourceBuilder.create().build();
}
@Bean(name="dynamicDataSource")
@Primary
publicDynamicDataSourcedataSource()
{
Map
启动类上添加注解
@Import({DataSourceConfig.class})
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
需要使用的方法上
@DataSource(value=DataSourceType.SLAVE)
DEMO
@Select("select*fromuser")
@DataSource(value=DataSourceType.SLAVE)
ListselectUserList();
总结
到此这篇关于SpringBoot自定义注解使用读写分离Mysql数据库的文章就介绍到这了,更多相关SpringBoot自定义注解使用读写分离Mysql内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。