热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

SpringBoot自定义注解使用读写分离Mysql数据库的实例教程

这篇文章主要给大家介绍了关于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

/**
 * 数据源类型枚举
 * @author yangjc01
 * @create 2020/11/02
 */
public enum DataSourceType {
 /**
  * 主库,主要进行写操作
  */
 MASTER,
 /**
  * 从库,进行读操作
  */
 SLAVE
}

DynamicDataSource

/**
 * 动态数据源
 * @author yangjc01
 * @create 2020/11/02
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

 public DynamicDataSource(DataSource defaultTargetDataSource,
  Map targetDataSources) {
  super.setDefaultTargetDataSource(defaultTargetDataSource);
  super.setTargetDataSources(targetDataSources);
  super.afterPropertiesSet();
 }

 @Override
 protected Object determineCurrentLookupKey() {
  return DynamicDataSourceContextHolder.getDateSourceType();
 }
}

DynamicDataSourceContextHolder

public class DynamicDataSourceContextHolder {

 /**
  * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
  * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
  */
 private static final ThreadLocal CONTEXT_HOLDER = 
 new ThreadLocal<>();

 /**
  * 设置数据源的变量
  */
 public static void setDateSourceType(String dsType) {
  CONTEXT_HOLDER.set(dsType);
 }

 /**
  * 获得数据源的变量
  */
 public static String getDateSourceType() {
  return CONTEXT_HOLDER.get();
 }

 /**
  * 清空数据源变量
  */
 public static void clearDateSourceType() {
  CONTEXT_HOLDER.remove();
 }
}

DataSource 注解

/**
 * @author yangjc01
 * @create 2020/11/01
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSource {
 /**
  * 切换数据源
  */
 DataSourceType value() default DataSourceType.MASTER;

}

DataSourceAspect 切面

@Aspect
@Order(1)
@Component
public class DataSourceAspect {

 @Pointcut("@annotation(com.jgame.mis.annotation.DataSource)")
 public void dsPointCut() {

 }

 @Around("dsPointCut()")
 public Object around(ProceedingJoinPoint point) throws Throwable {
  MethodSignature signature = (MethodSignature) point.getSignature();

  Method method = signature.getMethod();

  DataSource dataSource = method.getAnnotation(DataSource.class);

  if (null!=dataSource) {
   DynamicDataSourceContextHolder.
   setDateSourceType(dataSource.value().name());
  }

  try {
   return point.proceed();
  } finally {
   // 销毁数据源 在执行方法之后
   DynamicDataSourceContextHolder.clearDateSourceType();
  }
 }
}

DataSourceConfig

@Configuration
public class DataSourceConfig {

 @Bean
 @ConfigurationProperties("spring.datasource.master")
 public DataSource masterDataSource() {
  return DataSourceBuilder.create().build();
 }

 @Bean
 @ConfigurationProperties("spring.datasource.slave")
 public DataSource slaveDataSource() {
  return DataSourceBuilder.create().build();
 }

 @Bean(name = "dynamicDataSource")
 @Primary
 public DynamicDataSource dataSource()
 {
  Map targetDataSources = new HashMap<>();
  targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource());
  targetDataSources.put(DataSourceType.SLAVE.name(), slaveDataSource());
  return new DynamicDataSource(masterDataSource(), targetDataSources);
 }
}

启动类上添加注解

@Import({DataSourceConfig.class})
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

需要使用的方法上

@DataSource(value = DataSourceType.SLAVE)

DEMO

	@Select("select * from user")
  @DataSource(value = DataSourceType.SLAVE)
  List selectUserList();

总结

到此这篇关于SpringBoot自定义注解使用读写分离Mysql数据库的文章就介绍到这了,更多相关SpringBoot自定义注解使用读写分离Mysql内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
author-avatar
陈鑫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有