中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么通過Java監聽MySQL數據的變化

發布時間:2023-03-14 14:12:54 來源:億速云 閱讀:140 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么通過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();

    }

    /**
     * 連接mysqlBinLog
     */
    public void connectMysqlBinLog() {
        log.info("監控BinLog服務已啟動");

        //自己MySQL的信息。host,port,username,password
        BinaryLogClient client = new BinaryLogClient("localhost", 3306, "root", "root");
        /**因為binlog不是以數據庫為單位劃分的,所以監控binglog不是監控的單個的數據庫,而是整個當前所設置連接的MySQL,
         *其中任何一個庫發生數據增刪改,這里都能檢測到,
         *所以不用設置所監控的數據庫的名字(我也不知道怎么設置,沒發現有包含這個形參的構造函數)
         *如果需要只監控指定的數據庫,可以看后面代碼,可以獲取到當前發生變更的數據庫名稱。可以根據名稱來決定是否監控
         **/

        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數據的變化”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金坛市| 仙游县| 伽师县| 阿拉尔市| 隆德县| 庐江县| 凉山| 巴中市| 奈曼旗| 开远市| 余干县| 宜兰市| 蒙阴县| 吴堡县| 汾阳市| 曲阜市| 台东市| 山阴县| 宜城市| 云林县| 宁南县| 华池县| 玉龙| 图们市| 修水县| 湘潭县| 隆回县| 上栗县| 延庆县| 察雅县| 湖南省| 垣曲县| 文山县| 商水县| 山东省| 府谷县| 滕州市| 博乐市| 蚌埠市| 曲阳县| 道孚县|