需求场景
为了防止代码中对SQL的缓慢查询,会影响在线主数据库的性能。 必须切换到从库中执行sql查询操作。 为了便于使用,以自定义注释的形式使用。
mysql导入依赖关系
mysql
mysql-connector-java
8.0.16
代码实现
配置文件
application.yml
spring:
datasource:
大师3:
username :根
password: 123456
JDBC-URL : JDBC : MySQL ://localhost :3306/master? useUnicode=true遵循的小蘑菇=utf-8serverTimezone=GMT 8
driver-class-name : com.MySQL.CJ.JDBC.driver
slave:
username :根
password: 123456
JDBC-URL : JDBC : MySQL ://localhost :3306/slave? useUnicode=true遵循的小蘑菇=utf-8serverTimezone=GMT 8
driver-class-name : com.MySQL.CJ.JDBC.driver
数据源类型
//*
*数据源类型枚举
* @author暴坊01
* @create 2020/11/02
*/
公共枚举数据源类型{
//*
*主库,主要是写入
*/
大师、
//*
从库中进行读取操作
*/
从属端
}
动态数据源
//*
*动态数据源
* @author暴坊01
* @create 2020/11/02
*/
publicclassdynamicdatasourceextendsabstractroutingdatasource {
publicdynamicdatasource (datasourcedefaulttargetdatasource,
映射目标数据源) {
super.setdefaulttargetdatasource (defaulttargetdatasource;
super.settargetdatasources;
super.afterPropertiesSet (;
}
@Override
protectedobjectdeterminecurrentlookupkey {
returndynamicdatasourcecontextholder.getdate source type (;
}
}
DynamicDataSourceContextHolder
publicclassdynamicdatasourcecontextholder {
//*
*使用threadlocal维护变量,threadlocal为使用该变量的每个线程提供独立变量的副本。
*因此,每个线程都可以修改自己的副本,而不影响其他线程的副本。
*/
privatestaticfinalthreadlocalcontext _ holder=
新thread local (;
//*
设置数据源的变量
*/
publicstaticvoidsetdatesourcetype {
context_holder.set(dstype;
}
//*
获取数据源的变量
*/
publicstaticstringgetdatesourcetype {
return CONTEXT_HOLDER.get (;
}
//*
清空数据源变量
*/
publicstaticvoidcleardatesourcetype {
CONTEXT_HOLDER.remove (;
}
}
数据源注释
//*
* @author暴坊01
* @create 2020/11/01
*/
@target(elementtype.method )。
@ retention (retention policy.runtime ) )。
公共@接口数据源{
//*
切换数据源
*/
数据source type value () default DataSourceType.MASTER;
}
数据源aspect切面
@Aspect
@order(1) )。
@Component
公共类数据源攻击{
@ pointcut (' @ annotation (com.jgame.mis.annotation.data source ) ) )
公共语音ds pointcut
}
@around(dspointcut ) ) )
publicobjectaround (处理联合点) throws Throwable {
methodsignaturesignature=(methodsignature ) point.getSignature );
方法方法=signature.get method (;
atasourcedatasource=method.get annotation (data source.class );
if (空!=数据源
DynamicDataSourceContextHolder。
设置日期源类型(data source.value ().name );
}
try {
return point.proceed (;
} finally {
//销毁数据源是在执行方法后
dynamicdatasourcecontextholder.cleardatesourcetype (;
}
}
}
数据源配置
@Configuration
公共类数据源配置{
@Bean
@ configuration properties (spring.data source.master )。
publicdatasourcemasterdatasource (
返回数据源builder.create ().build );
}
@Bean
@ configuration properties (spring.data source.slave )。
publicdatasourceslavedatasource (
返回数据源builder.create ().build );
}
@ bean (name='动态数据源' )。
@Primary
publicdynamicdatasourcedatasource (
{
maptargetdatasources=new hashmap (;
target data sources.put (data source type.master.name (,masterDataSource ) );
target data sources.put (data source type.slave.name (,slaveDataSource ) );
returnnewdynamicdatasource (主数据源)、target数据源);
}
}
向启动类添加注释
@ import (数据源配置. class ) )
@ springbootapplication (exclude={ datasourceautoconfiguration.class }
在使用的方法中
@ data source (值=data source type.slave ) )。
德谟
@select(select*fromuser ) )
@ data source (值=data source type.slave ) )。
列表选择用户列表(;
总结
到目前为止,我们介绍了使用SpringBoot自定义注释读写分离Mysql数据库的文章。 要使用更多相关的SpringBoot自定义注释读写隔离Mysql内容,请搜索云海天教程中的以前文章,或继续查看以下相关文章: 今后,云海天教程就拜托你了。
原文链接: https://blog.csdn.net/QQ _ 45186545/article/details/109445520