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

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

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

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

这篇文章主要介绍“怎么通过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.zendesk</groupId>            <artifactId>mysql-binlog-connector-java</artifactId>            <version>0.27.1</version> <!--2022.09.17版的-->        </dependency>

顺便附上com.github.shyiko

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

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数据的变化”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

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

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

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

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

下载Word文档

猜你喜欢

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

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

通过Java监听MySQL数据的变化

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

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

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

mysql怎么监听数据变化

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

java怎么监听oracle数据变化

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

java怎么监听oracle数据变化

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

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

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

angular怎么监听数据变化

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

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

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

java怎么监听MySQL某个数据

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

java编程怎么监听屏幕变化

在Java中,可以使用Java AWT和JavaFX来监听屏幕变化。使用Java AWT可以使用`java.awt.Toolkit`类和`java.awt.AWTEvent`类来监听屏幕变化。具体步骤如下:创建一个继承自`java.awt
2023-10-27

vue中怎么监听数组变化

这篇文章主要介绍了vue中怎么监听数组变化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue是什么Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它
2023-06-14

java怎么实时监控数据变化

在Java中实现实时监控数据变化的方式主要有以下几种:1. 使用线程轮询:创建一个线程,在循环中定期地查询数据的变化情况。可以使用`Thread.sleep()`方法来控制查询的频率。```javaThread thread = new T
2023-08-17

redis怎么监听mysql数据库数据

Redis本身并不支持直接监听MySQL数据库的数据变化。但你可以通过编写程序,使用MySQL的binlog来监听数据库的数据变化,并将变化的数据同步到Redis中。具体步骤如下:1. 首先,确保你的MySQL数据库开启了binlog。你可
2023-08-30

java怎么监听文件变化并读取文件

Java可以通过使用Java NIO包中的WatchService类来监听文件变化,并使用Java IO或Java NIO来读取文件。以下是一种基本的使用WatchService监听文件变化的方法:创建WatchService对象并注册要
2023-10-27

java怎么监听redis某个数据

Redis数据更改监听Java提供多种方法监听Redis数据更改,包括:使用RedisTemplate订阅键空间通知使用Jedis监听键空间通知使用Lettuce监听键空间通知使用Sentinel监听Redis主从复制使用JRedis监听Redis频道选择合适的监听方法取决于应用程序要求。最佳实践包括使用不同的频道分类事件、设置合理的超时时间和考虑多线程或事件驱动编程。
java怎么监听redis某个数据
2024-04-10

编程热搜

目录