通过监听BinLog,获取指定表的增删改操作
1.打开mysql控制台执行以下,启动log_bin
show variables like '%log_bin%' ;
如果是OFF则表示未启用
2.pom文件添加依赖
<dependency>
<groupId>com.github.shyiko</groupId>
<artifactId>mysql-binlog-connector-java</artifactId>
<version>0.21.0</version>
</dependency>
3.然后再看逻辑代码:
实现是在connectMysqlBinLog()方法中的,里面通过data instanceof XXX ,即可查询到执行的增删改什么请求,详细请看代码
public void run(ApplicationArguments args) {
//项目启动完成连接bin-log
new Thread(() -> {
String binLog = connectMysqlBinLog();
System.out.println("binLog = " + binLog);
}).start();
}
static String result = "";
/**
* 连接mysqlBinLog
*/
public String connectMysqlBinLog() {
log.info("监控BinLog服务已启动");
BinaryLogClient client = new BinaryLogClient("192.168.0.XXX", 3306, "root", "password");
client.setServerId(100); //和自己之前设置的server-id保持一致,但是我不知道为什么不一致也能成功
client.registerEventListener(event -> {
EventData data = event.getData();
if (data instanceof TableMapEventData) {
//只要连接的MySQL发生的增删改的操作,则都会进入这里,无论哪个数据库
TableMapEventData tableMapEventData = (TableMapEventData) data;
//指定获取到某个数据库的数据,并指定到表,记录表明
if(tableMapEventData.getDatabase().equals("data_base")){
currentTable = tableMapEventData.getTable();
}
}
//表数据发生插入时触发
if (data instanceof WriteRowsEventData && currentTable != null) {
WriteRowsEventData writeEventData = (WriteRowsEventData) data;
//判断发生新增的是否和上面记录的表名一致
if ("data_table".equals(currentTable)){
for (Serializable[] row : writeEventData.getRows()) {
if (Arrays.toString(row).contains("SYCreditEvaluate")){
//记录发生新增数据的insert语句
log.info(currentTable + "Values inserted: " + Arrays.toString(row));
try {
String result = convertStringToPerson(Arrays.toString(row));
log.info("---->正常获取到表"+ currentTable + "实时进件的决策数据," + result);
}catch (Exception e){
log.error("---->捕获异常,请查看"+ currentTable + "表在实时获取进件数据时是否发生异常!");
}
break;
}
}
}
currentTable = null;
}
});
try {
client.connect();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
public String convertStringToPerson(String rowString) {
//可以通过截取到的索引带入方法获取到具体数据
String[] split = rowString.split(",");
String creditId = split[1].trim();
String orderId = split[1].trim();
System.out.println("creditId = " + creditId);
System.out.println("orderId = " + orderId);
return "";
}
4.同理可通过以下获取到修改删除等操作
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());
}