iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何通过Java监听MySQL数据的变化
  • 408
分享到

如何通过Java监听MySQL数据的变化

摘要

目录原理开启Mysql的binlog功能Java监听mysql的binlog实现监听数据变化总结原理 原理:java通过bin-log监控mysql数据变化 binlog :binl

原理

原理:java通过bin-log监控mysql数据变化

binlog :binlog 就是binary log,二进制日志文件,这个文件记录了mysql所有的增、删、改语句。通过binlog日志我们可以做数据恢复,做主从复制等等。可以看到,只要有了这个binlog,我们就拥有了mysql的完整备份了。

就是说一旦开启了这个功能,数据库中数据的任何变化,都会记录到这种日志文件中,所以可以通过Java监听这种的文件,来监听MySQL数据的变化。

开启MySQL的binlog功能

首先,需要开启MySQL的binlog功能,MySQL默认是未开启的

查询是否开始binlog功能的sql语句:show VARIABLES like '%log_bin%';

log_bin的值是on则表示开启,我也不知道没开启是没有这个还是值是off,我也不敢瞎说

开启分为两步,1.改配置 2.重启MySQL服务

改配置

打开自己MySQL的配置文件,比如PC端的即my.ini文件,加上下面三句

log-bin=mysql-bin #[必须]启用二-进制日志
server-id=100 #[必须]服务器唯一ID,如果是用于多台MySQL,ID不要重复就行
binlog-fORMat = ROW #这句也得加,下面解释

改完,然后重启MySQL服务就可以了

说明:

mysql-bin只是个名字而已,可以随便起。将来保存的日志文件名就是mysql-bin.000001,mysql-bin.000002这样的。生成的日志文件会存放在自己的MySQL的存放数据的文件夹,比如我设置的存放MySQL数据的文件夹目录是:D:\MySql\mysql-8.0.24\data\,然后生成的日志文件就会在这个目录下。

binlog-format = ROW,binlog_format 设置为 ROW可以保证数据的一致, 因为在 STATEMENT 或 MIXED 模式下, Binlog 只会记录和传输 SQL 语句(以减少日志大小),而不包含具体数据,我们也就无法保存了。

Java监听MySQL的binlog实现监听数据变化

Java需要使用一个工具mysql-binlog-connector-java

导入jar包:

这个Jar包有两个版本,一个是com.GitHub.shyiko的一个是com.zendesk,使用方式和代码完全一样,只是各自的实现方式可能不同,但是com.github.shyiko20年停止更新了,对于MySQL8兼容性不是很好,建议使用com.zendesk。

        <dependency>
            <groupId>com.zendesk</groupId>
            <artifactId>mysql-binlog-connector-java</artifactId>
            <version>0.27.1</version> <!--2022.09.17版的-->
        </dependency>

顺便附上com.github.shyiko

MySQL8及以上使用com.github.shyiko的可能会出现Client does not support authentication protocol requested by server...错误

原因:mysql8 之前的版本中加密规则是mysql_native_passWord,而在mysql8之后,加密规则是caching_sha2_password,

解决办法:把mysql用户登录密码加密规则还原成mysql_native_password,
SQL语句:ALTER USER 'root'@'自己需要连接的数据库的host,自己本机的就用localhost' IDENTIFIED WITH mysql_native_password BY '自己所使用的登录密码';
然后就好了

然后再看逻辑代码:

实现是在connectMysqlBinLog()方法中的,里面通过data instanceof ****,即可查询到执行的增删改什么请求,详细请看代码,看一下就明白了

//为什么甚至路径都一样,还是com.github.shyiko.***,
// 因为com.zendesk这个包,里面包了个com.github.shyiko.***这玩意,我怀疑是收购关系
import com.github.shyiko.mysql.binlog.BinaryLoGClient;
import com.github.shyiko.mysql.binlog.event.*;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

//此类可以监控MySQL库数据的增删改
@Component
@Slf4j  //用于打印日志
//在SpringBoot中,提供了一个接口:ApplicationRunner。
//该接口中,只有一个run方法,他执行的时机是:spring容器启动完成之后,就会紧接着执行这个接口实现类的run方法。
public class MysqlBinLogClient implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        //项目启动完成连接bin-log
        new Thread(() -> {
            connectMysqlBinLog();
        }).start();

    }

    
    public void connectMysqlBinLog() {
        log.info("监控BinLog服务已启动");

        //自己MySQL的信息。host,port,username,password
        BinaryLogClient client = new BinaryLogClient("localhost", 3306, "root", "root");
        

        client.setServerId(100); //和自己之前设置的server-id保持一致,但是我不知道为什么不一致也能成功

//下面直接照抄就行
        client.reGISterEventListener(event -> {
            EventData data = event.getData();
            if (data instanceof TableMapEventData) {
                //只要连接的MySQL发生的增删改的操作,则都会进入这里,无论哪个数据库

                TableMapEventData tableMapEventData = (TableMapEventData) data;

                //可以通过转成TableMapEventData类实例的tableMapEventData来获取当前发生变更的数据库
                System.out.println("发生变更的数据库:"+tableMapEventData.getDatabase());

                System.out.print("TableID:");
                //表ID
                System.out.println(tableMapEventData.getTableId());
                System.out.print("TableName:");
                //表名字
                System.out.println(tableMapEventData.getTable());
            }
            //表数据发生修改时触发
            if (data instanceof UpdateRowsEventData) {
                System.out.println("Update:");
                System.out.println(data.toString());
                //表数据发生插入时触发
            } else if (data instanceof WriteRowsEventData) {
                System.out.println("Insert:");
                System.out.println(data.toString());
                //表数据发生删除后触发
            } else if (data instanceof DeleteRowsEventData) {
                System.out.println("Delete:");
                System.out.println(data.toString());
            }
        });

        try {
            client.connect();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

有一定可能数据发生变更后控制台没打印,可能是加载慢的原因,稍等一会控制台就可能会打印相关信息

总结

到此这篇关于如何通过Java监听MySQL数据的变化的文章就介绍到这了,更多相关Java监听MySQL数据变化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 如何通过Java监听MySQL数据的变化

本文链接: https://www.lsjlt.com/news/199723.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何通过Java监听MySQL数据的变化
    目录原理开启MySQL的binlog功能Java监听MySQL的binlog实现监听数据变化总结原理 原理:java通过bin-log监控mysql数据变化 binlog :binl...
    99+
    2023-03-14
    java监听mysql数据表变化 java监听数据库变化 监听mysql数据变化
  • 通过Java监听MySQL数据的变化
    文章目录 实现Java监听MySQL数据是否发生变化原理开启MySQL的binlog功能Java监听MySQL的binlog实现监听数据变化 实现Java监听MySQL数据是否发生变化 原理 原理:java通过bin-...
    99+
    2023-08-19
    1024程序员节 java mysql
  • 怎么通过Java监听MySQL数据的变化
    这篇文章主要介绍“怎么通过Java监听MySQL数据的变化”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么通过Java监听MySQL数据的变化”文章能帮助大家解决问题。原理:java通过bin-l...
    99+
    2023-07-05
  • mysql怎么监听数据变化
    MySQL本身并没有提供直接监听数据变化的功能。但是可以通过以下几种方式来实现数据变化的监听: 使用触发器(Trigger):可...
    99+
    2024-04-09
    mysql
  • php如何监听数据库变化
    要监听数据库的变化,可以使用以下两种方法:1. 轮询:在应用程序中设置一个定时器,定期查询数据库以检查是否有变化。可以使用定时器函数...
    99+
    2023-09-09
    php 数据库
  • java怎么监听oracle数据变化
    要监听Oracle数据库中的数据变化,可以使用Oracle的触发器(Trigger)或者Oracle的Java消息服务(Oracle...
    99+
    2023-10-27
    java oracle
  • vue如何用watch监听数据变化
    这篇文章主要介绍“vue如何用watch监听数据变化”,在日常操作中,相信很多人在vue如何用watch监听数据变化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何用watch监听数据变化”的疑惑有所...
    99+
    2023-07-04
  • java怎么监听数据库表数据变化
    在Java中监听数据库表数据变化可以通过以下几种方式实现:1. 使用JDBC的数据库触发器:使用JDBC连接数据库,注册相应的触发器...
    99+
    2023-09-27
    java 数据库
  • 如何监听mysql表内容变化
    这篇文章主要为大家展示了“如何监听mysql表内容变化”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何监听mysql表内容变化”这篇文章吧。前言binlog ...
    99+
    2024-04-02
  • angular怎么监听数据变化
    在Angular中,可以使用Angular的Change Detection机制来监听数据的变化。 使用双向数据绑定:双向数据绑...
    99+
    2023-10-24
    angular
  • vue如何使用watch监听指定数据的变化
    目录使用watch监听指定数据的变化vue watch监听多个值使用watch监听指定数据的变化  在vue中,可以使用watch属性来监听data中某个属性值的变化。 &...
    99+
    2024-04-02
  • vuex如何用state监听数组变化
    这篇文章主要介绍了vuex如何用state监听数组变化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vuex如何用state监听数组变化文章都会有所收获,下面我们一起来看看吧。代码如下:import ...
    99+
    2023-07-04
  • python怎么监听数据库表的变化
    在Python中,可以使用数据库的触发器(trigger)来监听数据库表的变化。触发器是一段在特定事件(例如插入、更新、删除等)发生...
    99+
    2023-09-09
    python 数据库
  • AngularJS如何监听路由变化
    这篇文章将为大家详细讲解有关AngularJS如何监听路由变化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用AngularJS时,当路由发生改变时,我们需要做某些处理...
    99+
    2024-04-02
  • jquery如何监听元素变化
    在jquery中监听元素变化的方法:1.新建html项目,引入jquery;2.创建div标签,设置id属性;3.使用change事件监听元素变化;具体步骤如下:首先,在新建一个html项目,在项目中引入jquery;<script ...
    99+
    2024-04-02
  • Java 实现实时监听MySQL数据库变更MySQLBinListener
    目录 1、导出需要的类和接口 2、 定义 MySQLBinlogListener类 3、私有方法,启动重连定时器 4、完整代码   编写一个MySQL数据库实时变更的监听器。 为什么要编写这个一个监听器:为了实时监测和响应MySQL数据库...
    99+
    2023-09-08
    数据库 mysql java
  • 关于vue中如何监听数组变化
    目录前言源码部分从哪开始第一步学习呢从图开始看看源码吧前言 前段时间学习了关于vue中响应式数据的原理,(并作了学习笔记vue响应式原理),其实是通过Object.definePro...
    99+
    2024-04-02
  • java如何监听文件变化并读取文件
    Java中可以使用java.nio.file包中的WatchService类来监听文件的变化,并使用BufferedReader类来...
    99+
    2023-09-26
    java
  • java如何监听redis某个数据
    要监听Redis中的某个数据,可以使用Redis的订阅与发布功能。下面是一个简单的示例代码,演示了如何在Java中监听Redis中指...
    99+
    2024-04-02
  • vue前端测试开发watch如何监听data的数据变化
    本篇内容主要讲解“vue前端测试开发watch如何监听data的数据变化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue前端测试开发watch如何监听data的数据变化”吧!watch监听d...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作