Java 实现对部分MySQL表监听

这篇博客介绍了如何在Java中使用mysql-binlog-connector-java库来监听MySQL的binlog事件。通过配置和实现监听器,可以捕获数据库的插入、更新和删除操作,实现实时的数据变更同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导入监听日志的支持:

<!--binlog支持-->
<dependency>
  <groupId>com.github.shyiko</groupId>
  <artifactId>mysql-binlog-connector-java</artifactId>
  <version>0.18.1</version>
</dependency>
  1. 监听实现类:

前提:开启MySQL binlog 在my.ini文件下

BinaryLogClient client = new BinaryLogClient(host, port, username, password);
        //设置需要读取的Binlog的文件读以及位置,否则,client会从"头"开始取Binlog并监听
//        String path = "D:\\mysql-5.7.16-winx64\\data\\mysql-bin.000001";
//        client.setBinlogFilename(path);
        /*client.setBinlogPosition(1);*/
        client.setServerId(1);
        //给客户端注册监听器,实现对Binlog的监听和解析
        //event 就是监听到的Binlog变化信息,event包含header & data 两部分
        client.registerEventListener(event -> {
            EventData data = event.getData();
            Map<Long, TableInit.TableBean> tableMap = TableInit.getTableMap();
            //动态获取当前tableId,更新map
            if (data instanceof TableMapEventData) {
                TableMapEventData mapEventData = (TableMapEventData) data;
                long tableId = mapEventData.getTableId();
                String tableName = mapEventData.getTable();
                Long s = null;
                if (TableInit.tableNameList.contains(tableName)) {
                    for (Long key : TableInit.table.keySet()) {
                        if (key != tableId && TableInit.table.get(key).getTableName().equals(tableName)) {
                            TableInit.table.put(tableId, TableInit.table.get(key));
                            s = key;
                        }
                    }
                }
                if (s != null) {
                    TableInit.table.remove(s);
                }
            }
            //修改监听事件
            if (data instanceof UpdateRowsEventData) {
                System.out.println("--------Update-----------");
                UpdateRowsEventData eventData = (UpdateRowsEventData) data;
                TableInit.TableBean tableBean = tableMap.get(eventData.getTableId());
                updateBinlog(eventData, tableBean);
                //新增监听事件
            } else if (data instanceof WriteRowsEventData) {
                System.out.println("--------Insert-----------");
                WriteRowsEventData eventData = (WriteRowsEventData) data;
                List<Serializable[]> rows = eventData.getRows();
                saveBinlog(tableMap, rows, eventData.getTableId(), TableInit.OPERATION_TYPE_INSERT);
                //删除的监听事件
            } else if (data instanceof DeleteRowsEventData) {
                System.out.println("--------Delete-----------");
                DeleteRowsEventData eventData = (DeleteRowsEventData) data;
                List<Serializable[]> rows = eventData.getRows();
                saveBinlog(tableMap, rows, eventData.getTableId(), TableInit.OPERATION_TYPE_DELETE);
            }
        });
        try {
            client.connect();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值