MySQL与ES数据同步之同步调用

news2024/11/27 12:07:47

这是第一种方法,也是最简单的方法,在对mysql进行增删改查时,操作后直接调用ES方法实现增删改查。
可以看出这种方式业务逻辑简单,实时性高,但是会有业务强耦合,存在双写失败丢数据风险,性能也比较差,代码侵入强,不推荐,但是可以作为一种普通方案简单来看一下。
接下来,我们通过SpringBoot项目实际操作一下

SpringBoot项目

引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

配置文件

注意修改mysql地址

server:
  port: 8080

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://mysql地址/mysql?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
  elasticsearch:
    rest:
      uris: 101.200.128.156:9200

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml

项目结构

在这里插入图片描述

实体类

/**
 * mysql(user)与ES(user-demo)实体类
 */
@Data
@TableName(value = "user_t")
@Document(indexName = "user-demo")
public class User {
    @Id
    private String id;
    private String userName;
    private String address;
}

Mapper类

UserMapper

/**
 * mysql user实体Mapper类
 */
public interface UserMapper extends BaseMapper<User> {
}

UserEsMapper


/**
 * ES user-demo实体Mapper类
 */
@Repository
public interface UserEsMapper extends ElasticsearchRepository<User,String> {

}

Controller

这里可以看到调用mysql方法后,同步调用对ES做相同操作的方法

/**
 * 同步调用方式实现mysql与ES数据同步Controller
 */
@RestController
@RequestMapping("/sycn")
public class DataController {

    @Resource
    private IDataService dataService;

    /**
     * 同步更新mysql和ES的user信息
     * @param user user实体
     */
    @GetMapping("/update")
    public void updateData(User user){
        dataService.updateMysqlData(user);
        dataService.esAddData(user);
    }

    /**
     * 查询user表信息
     * @return user信息集合
     */
    @GetMapping("/findData")
    public List<User> findAllData(){
        return dataService.findAllData();
    }

    /**
     * 同步根据id删除mysql和ES中user对应的数据信息
     * @param id 需要删除的信息id
     */
    @GetMapping("/delete")
    public void deleteDataById(String id){
        dataService.deleteDataById(id);
        dataService.esDeleteDataById(id);
    }

    /**
     * 同步新增mysql和ES的user数据
     * @param user user实体
     */
    @GetMapping("addData")
    public void addData(User user){
        dataService.addData(user);
        dataService.esAddData(user);
    }

    /**
     * 同步删除mysql和ES中所有user信息
     */
    @GetMapping("deleteAll")
    public void deleteAllData(){
        dataService.deleteAllData();
        dataService.esDeleteAllData();
    }
}

Service接口

/**
 * 同步调用方式实现mysql与ES数据同步Service
 */
public interface IDataService extends IService<User> {

    /**
     * 根据id更新mysql数据
     * @param user 需要更新数据的user对象
     */
    void updateMysqlData(User user);

    /**
     * 查询所有数据
     * @return user对象集合
     */
    List<User> findAllData();

    /**
     * mysql根据id删除信息
     * @param id 需要删除信息的id
     */
    void deleteDataById(String id);

    /**
     * mysql新增数据
     * @param user 需要新增数据的对象
     */
    void addData(User user);

    /**
     * ES根据ID删除数据
     * @param id 需要删除信息的id
     */
    void esDeleteDataById(String id);

    /**
     * ES新增/根据ID修改数据
     * @param user 需要新增/根据ID修改数据的对象
     */
    void esAddData (User user);

    /**
     * mysql删除user表所有数据
     */
    void deleteAllData();

    /**
     * es删除index=user-demoa中所有数据
     */
    void esDeleteAllData();
}

Service实现类

/**
 * 同步调用方式实现mysql与ES数据同步Service实现类
 */
@Service
public class DataServiceImpl extends ServiceImpl<UserMapper, User> implements IDataService {

    @Resource
    private UserMapper userMapper;
    @Resource
    private UserEsMapper userEsMapper;

    /**
     * 根据id更新mysql数据
     * @param user 需要更新数据的user对象
     */
    @Override
    public void updateMysqlData(User user) {
        userMapper.updateById(user);
    }

    /**
     * 查询所有数据
     * @return user对象集合
     */
    @Override
    public List<User> findAllData() {
        return userMapper.selectList(null);
    }

    /**
     * mysql根据id删除信息
     * @param id 需要删除信息的id
     */
    @Override
    public void deleteDataById(String id) {
        userMapper.deleteById(id);
    }

    /**
     * mysql新增数据
     * @param user 需要新增数据的对象
     */
    @Override
    public void addData(User user) {
        userMapper.insert(user);
    }

    /**
     * ES根据ID删除数据
     * @param id 需要删除信息的id
     */
    @Override
    public void esDeleteDataById(String id) {
        userEsMapper.deleteById(id);
    }

    /**
     * ES新增/根据ID修改数据
     * @param user 需要新增/根据ID修改数据的对象
     */
    @Override
    public void esAddData(User user) {
        userEsMapper.save(user);
    }

    /**
     * mysql删除user表所有数据
     */
    @Override
    public void deleteAllData() {
        userMapper.delete(null);
    }

    /**
     * es删除index=user-demoa中所有数据
     */
    @Override
    public void esDeleteAllData() {
        userEsMapper.deleteAll();
    }

}

到这里就结束了,下一篇我们来看看异步调用是怎么实现的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1004597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

趣解设计模式之《为什么租房子要找中介?》

〇、小故事 小王大学毕业了&#xff0c;打算来北京闯荡一下&#xff0c;于是就先寄宿到了他的表姐家&#xff0c;白天的时候&#xff0c;自己在外面小区转一转&#xff0c;看看能不能找到可以租到的房子&#xff0c;他找了好几天都没有找到合适的&#xff0c;要么就是小区里一…

每天40min,我们一起用70天稳扎稳打学完《JavaEE初阶》——33/70 第三十三天【JavaScript(webapi)】

JavaScript WebAPI WebAPI 背景知识DOM 基本概念获取元素事件初识操作元素输入密码的 显示 和隐藏点击计数器勾选复选框获取/修改 样式 属性开关灯WebAPI 背景知识 DOM 基本概念 获取元素 事件初识

JUC简介与环境搭建

1.新建一个Maven项目 2.导入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version></dependency> 3.检查Java版本 4.什么是JUC JUC&#xff08;java.util.co…

vue-tabel 中使用 el-autocomplete 出现的问题

必须加 :popper-append-to-body"false" :popper-class"vxetableignoreclear" 我自己用的话缺一不可 说一下我自己项目中遇到的问题吧&#xff0c;我写的是表格中套表格&#xff0c;会出现就是当下拉选的时候用selete是可以用的&#xff0c;但是用blur也…

026-从零搭建微服务-文件服务(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…

探索程序员需要掌握的算法?

文章目录 一&#xff1a;引言二&#xff1a;常见算法介绍三&#xff1a;重点算法总结 &#x1f389;欢迎来到数据结构学习专栏~探索程序员需要掌握的算法&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章…

SoC性能指标ARM内核运算能力

自动驾驶芯片常用的性能评价指标:TOPS,DMIPS,GFLOPS分别说的是啥&#xff1f; TOPS Tera Operation Per Second&#xff0c;表示每秒钟可以进行的操作数量&#xff0c;用于衡量自动驾驶的算力。 众所周知&#xff0c;汽车上最常用的传感器是摄像头&#xff0c;而与之对应的计…

【K8S系列】深入解析k8s网络插件—Canal

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 在现代容器化应用程序的世界中…

Java密码学之数字签名

密码系统是加密技术及其附带基础工具的实现&#xff0c;以提供信息安全服务。基本密码系统的各种组件是明文&#xff0c;加密算法&#xff0c;密文&#xff0c;解密算法&#xff0c;加密密钥和解密密钥。其中加密密钥和解密密钥是&#xff1a; 加密密钥是发件人已知的值。发送…

Jmeter——结合Allure展示测试报告 _

在平时用jmeter做测试时&#xff0c;生成报告的模板&#xff0c;不是特别好。大家应该也知道allure报告&#xff0c;页面美观。 先来看效果图&#xff0c;报告首页&#xff0c;如下所示&#xff1a; ​编辑 报告详情信息&#xff0c;如下所示&#xff1a; ​编辑 运行run.…

van-list 下拉刷新 触底分页 触底分页事件只加载一次

我是 头部是筛选的条件&#xff0c;&#xff0c;更换不同的状态&#xff0c;显示不同的列表数据&#xff0c;比如 审批中数据是 对的&#xff0c;触底分页也是对的&#xff0c;如果我切换一个状态的话&#xff0c;总共是 15条数据&#xff0c;但是 切换了状态只显示第一页的数据…

Java“牵手”拼多多商品详情数据,拼多多商品详情接口,拼多多API接口申请指南

拼多多商品详情API接口的作用是获取拼多多平台上某个商品的详细信息&#xff0c;包括商品标题、价格、图片、规格、参数、店铺信息等。 开发者可以通过该接口获取到商品的原始数据&#xff0c;方便进行数据分析、价格比较、爬取等操作。通过该接口获取到的商品详情数据可以结合…

(2023|ICLR,)用于一般噪声反演问题的扩散后验采样

Diffusion posterior sampling for general noisy inverse problems 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 进交流群获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 背景 2.1 基于分数的扩散模型 2.2 用扩散模型求解逆问题 3. 扩散后验采样…

接口优化1

接口优化 文章目录 接口优化1. 内容概述2. 集成RabbitMQ2.1 下载2.2 SpringBoot集成RabbitMQ 快速入门1.相关配置2.创建发送者者和接收者 2.3 rabbitmq四种交换模式2.4 秒杀接口优化 1. 内容概述 核心思路:减少对数据库的访问&#xff0c;利用Redis的高并发特性来实现。 系统初…

20.Xaml GroupBox控件 ---->带标题的内容控件

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

【excel加密】excel工作表保护和工作簿保护,有什么区别?

Excel不能编辑大家都知道时设置了工作表保护&#xff0c;在我们平时设置或取消工作表保护的时候也能够看到旁边的工作簿保护&#xff0c;那它的作用是什么呢&#xff1f;今天我们来看一下&#xff0c;工作表保护和工作簿保护的区别是什么吧&#xff01; 先统一讲一下如何设置保…

蓝色光标发布营销行业模型“Blue AI” 人机协同重构产业新格局

“Blue AI 行业模型的发布&#xff0c;标志着蓝色光标Al战略迈入新阶段”。蓝色光标集团CEO潘飞在发布会现场表示&#xff0c;把握好AI机会&#xff0c;会让蓝色光标更加接近于一家全球化的科技公司。今后&#xff0c;我们将继续沿着三个方面迭代与迈进&#xff1a;一是生产效率…

如何在多版本C#工程上添加程序集

给出工程配置文件添加程序集示例&#xff1a; <ItemGroup Condition"$(TargetFramework) net451"> <PackageReference Include"MySql.Data" Version"6.7.9" /> <Reference Include"System.Configuration" /&…

台式电脑组装爬坑之路

台式电脑十大部件 CPU 主板 内存 硬盘 机箱 电源 显卡 CPU散热器 显示器 鼠标 键盘 基本知识

Java面试笔试acm版输入

首先区分scanner.nextInt()//输入一个整数&#xff0c;只能读取一个数&#xff0c;空格就停止。 scanner.next()//输入字符串&#xff0c;只能读取一个字符串&#xff0c;空格就停止&#xff0c;但是逗号不停止。 scanner.nextLine() 读取一行&#xff0c;换行停止&#xff0c…