我的编程空间,编程开发者的网络收藏夹
学习永远不晚

通过Java监听MySQL数据的变化

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

通过Java监听MySQL数据的变化

实现Java监听MySQL数据是否发生变化

原理

原理: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.zendeskgroupId>            <artifactId>mysql-binlog-connector-javaartifactId>            <version>0.27.1version>         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();        }    }}

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

来源地址:https://blog.csdn.net/qq_45821251/article/details/127490460

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

通过Java监听MySQL数据的变化

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

下载Word文档

猜你喜欢

通过Java监听MySQL数据的变化

文章目录 实现Java监听MySQL数据是否发生变化原理开启MySQL的binlog功能Java监听MySQL的binlog实现监听数据变化 实现Java监听MySQL数据是否发生变化 原理 原理:java通过bin-
2023-08-19

怎么通过Java监听MySQL数据的变化

这篇文章主要介绍“怎么通过Java监听MySQL数据的变化”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么通过Java监听MySQL数据的变化”文章能帮助大家解决问题。原理:java通过bin-l
2023-07-05

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

对于二次开发来说,很大一部分就找找文件和找数据库的变化情况,下面这篇文章主要给大家介绍了关于如何通过Java监听MySQL数据的变化的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-03-14

mysql怎么监听数据变化

MySQL本身并没有提供直接监听数据变化的功能。但是可以通过以下几种方式来实现数据变化的监听:使用触发器(Trigger):可以在表上创建触发器,当插入、更新或删除数据时触发相应的操作。触发器可以在数据变化前或变化后执行,可以使用触发器来记
mysql怎么监听数据变化
2024-04-09

java怎么监听oracle数据变化

使用JDBC监听Oracle数据更改本指南介绍如何使用JDBC接口在Java应用程序中监听Oracle数据库中的数据更改,包括:配置Oracle数据库创建Java监听类建立JDBC连接创建和添加RowSet监听器执行监听并处理数据更改示例代码提供了详细的分步说明,展示了如何使用JDBC捕获和处理Oracle数据库中的数据更改,以实现数据同步、告警和审计功能。此外,本文还提供了其他监听方法,如DCN和触发器。
java怎么监听oracle数据变化
2024-04-12

java怎么监听oracle数据变化

要监听Oracle数据库中的数据变化,可以使用Oracle的触发器(Trigger)或者Oracle的Java消息服务(Oracle Advanced Queuing)。1. 使用Oracle的触发器: - 在数据库中创建一个触发器,可
2023-10-27

java怎么监听数据库表数据变化

在Java中监听数据库表数据变化可以通过以下几种方式实现:1. 使用JDBC的数据库触发器:使用JDBC连接数据库,注册相应的触发器,当数据库表数据发生变化时,触发器会调用相应的方法进行处理。2. 使用数据库连接池实现:使用数据库连接池技术
2023-09-27

angular怎么监听数据变化

在Angular中,可以使用Angular的Change Detection机制来监听数据的变化。使用双向数据绑定:双向数据绑定是Angular中最常用的数据绑定方式。当数据发生变化时,Angular会自动更新视图。例如,在模板中使用ngM
2023-10-24

php如何监听数据库变化

要监听数据库的变化,可以使用以下两种方法:1. 轮询:在应用程序中设置一个定时器,定期查询数据库以检查是否有变化。可以使用定时器函数(如`setInterval`)来定期执行查询操作。这种方法的缺点是会消耗较多的服务器资源,并且可能会有一定
2023-09-09

python怎么监听数据库表的变化

在Python中,可以使用数据库的触发器(trigger)来监听数据库表的变化。触发器是一段在特定事件(例如插入、更新、删除等)发生时自动执行的代码。下面是使用MySQL数据库的示例代码:1. 首先,创建一个名为`my_trigger`的触
2023-09-09

vue如何用watch监听数据变化

这篇文章主要介绍“vue如何用watch监听数据变化”,在日常操作中,相信很多人在vue如何用watch监听数据变化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何用watch监听数据变化”的疑惑有所
2023-07-04

java怎么监听MySQL某个数据

MySQL数据库监听MySQL数据库监听允许应用程序接收数据库更改通知,触发实时更新、工作流和数据同步。Java实现方式包括:JDBC轮询(简单但效率低)MySQLConnector/JCDC(高效,但需要MySQL5.6+)MySQLConnector/XDevAPI(低延迟,但需要MySQL8.0+)选择方法取决于应用程序需求,最佳实践包括控制轮询间隔、选择适当的CDC插件、处理重试和监测监视器。
java怎么监听MySQL某个数据
2024-04-09

jQuery如何监听元素数据变化事件?

jQuery为元素数据变更事件提供了强大的事件监听机制。通过change()和input()事件,开发人员可以在元素值发生更改时执行JavaScript代码。此功能可用于响应用户输入,并动态更新页面内容。了解事件类型、语法、注意事项和高级用法,可以有效利用jQuery的数据变更事件监听功能,增强应用程序的响应性和用户体验。
jQuery如何监听元素数据变化事件?
2024-04-08

基于Android 监听ContentProvider 中数据变化的相关介绍

如果ContentProvider的访问者需要知道ContentProvider中的数据的变化情况,可以在ContentProvider发生数据变化时调用getContentResolver().notifyChange(uri,null)
2022-06-06

编程热搜

目录