mysql触发器监听数据投递中间件

这篇具有很好参考价值的文章主要介绍了mysql触发器监听数据投递中间件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目前市面上有许多的 CDC(Change Data Capture) 框架用于监听数据库的数据变动,例如:canal、Debezium、Maxwell等都是用来解析 binlog 日志实现事件的监听。但是有一个情况就是如果公司对 binlog 日志文件的权限管控的很严格,那么这些用于监听的工具就可能因为权限的问题无法使用。这里我尝试使用 mysql 的 UDF + 触发器 的方式来实现数据库层面的数据监听,然后调用本地的 java程序 以及发送 http请求的例子

1. 扩展安装

要想调用本地的java代码需要用到mysql的扩展程序 lib_mysqludf_sys

官网地址 https://github.com/mysqludf/lib_mysqludf_sys

linux平台需要将 .so 的文件复制到mysql的插件路径下面 /usr/lib/mysql/plugin/
windows平台需要将 .dll 路径安装到 mysql安装路径\lib\plugin下面,由于官网没有提供 .dll 文件,这里可以用我生成的

链接:https://pan.baidu.com/s/13RJK6wfVeHcCJkuC-BigAw?pwd=1234
提取码:1234

2. 链接程序

上面安装完成之后,需要将函数链接到mysql中

CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.dll';
CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.dll';
CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.dll';
CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.dll';
CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.dll';

3. 创建例子程序

这里写一个例子程序,将mysql中监听到的数据追加到文件当中,maven打成jar包

public class Application {

    public static void main(String[] args) {
        for (String arg : args) {
            System.out.println(hello(arg));
        }
    }

    public static String hello(String args) {
        try {
            File file = new File("E:\\data.txt");
            FileWriter writer = new FileWriter(file, true);
            writer.write(args);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return args;
    }
}

4. 创建存储过程

DELIMITER //
CREATE PROCEDURE execute_jar(IN data JSON)
BEGIN
  DECLARE cmd VARCHAR(255);
  SET cmd = CONCAT('java -jar E:/my-study-project/redis/target/redis-1.0.0-SNAPSHOT.jar "' , data , '"');
  SELECT sys_eval(cmd) into @select;
END //
DELIMITER ;

5. 创建触发器

CREATE TRIGGER t_order_trigger AFTER INSERT ON t_order
FOR EACH ROW
BEGIN
    -- 获取新插入的行数据并整合为一个 JSON 字符串
    DECLARE jsonData JSON;
    SET jsonData = JSON_OBJECT(
        'id', NEW.id,
        'userName', NEW.user_name,
        'orderId', NEW.order_id
    );
    -- 调用存储过程并传递整合的 JSON 字符串
    CALL execute_jar(jsonData);
END;

6. 测试表

create table t_order
(
    id        bigint auto_increment comment '主键id'
        primary key,
    user_name varchar(64) null comment '用户名称',
    order_id  bigint(64)  null comment '订单id'
)
    comment '订单表' collate = utf8mb4_general_ci;

7. 测试数据

insert into t_order(user_name, order_id) values ('zs', 1), ('ls', 2);

可以看到数据直接追加到文件中了,利用这个特性我们就可以来监听mysql的数据变动,然后投递到kafka或者rocketmq中去了
mysql触发器监听数据投递中间件

8. 发送http请求

上面的例子是当触发器触发时调用本的java程序,现在来写一个发起http请求将数据投递到我们的程序当中;
创建一个springboot项目,提供一个请求地址

@RestController
@RequestMapping("/test")
public class TestController {

    /**
     * Test
     *
     * @return the boolean
     * @since 1.0.0
     */
    @PostMapping("add")
    public boolean test(@RequestBody String json) {
        System.out.println(json);
        return true;
    }

}

创建好构建http请求的自定义存储过程

DELIMITER //
CREATE PROCEDURE execute_send(IN data JSON, IN url varchar(255))
BEGIN
  DECLARE cmd VARCHAR(255);
  DECLARE content_type VARCHAR(255) default 'application/json';
  DECLARE curl_cmd varchar(255);

  set cmd = CONCAT('curl -X POST -H "Content-Type: ', content_type, '" -d "', data, '" "', url, '"');
  SELECT sys_eval(cmd) into @select;
END //
DELIMITER ;

创建一个触发器,在数据插入之后将数据投递到我们的服务当中

CREATE TRIGGER t_order_trigger AFTER INSERT ON t_order
FOR EACH ROW
BEGIN
    -- 获取新插入的行数据并整合为一个 JSON 字符串
    DECLARE jsonData JSON;
    SET jsonData = JSON_OBJECT(
        'id', NEW.id,
        'userName', NEW.user_name,
        'orderId', NEW.order_id
    );
    -- 调用存储过程并传递整合的 JSON 字符串
    CALL execute_send(jsonData, 'http://localhost:9000/test/add');
END;

再次插入数据进行投递

insert into t_order(user_name, order_id) values ('zs', 1), ('ls', 2);

服务监听到插入后的数据了
mysql触发器监听数据投递中间件文章来源地址https://www.toymoban.com/news/detail-469028.html

到了这里,关于mysql触发器监听数据投递中间件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql数据库实验报告--实验五 存储过程和触发器

    在这个系列会更新一些最近老师要求写的实验报告~ 大家尽量对着我的文章做一个参考,不要盲目的cv,毕竟这个对于我们以后的工作学习还是十分重要的。 从这个实验开始,就不在cmd命令行里面进行mysql数据库的操作,因为代码长度和代码的复杂性,需使用 MySQL Workbench: 双

    2024年02月09日
    浏览(39)
  • 数据库系统原理及MySQL应用教程实验八触发器创建与管理

    1.理解触发器的概念与类型。 2.理解触发器的功能及工作原理。 3.掌握创建、更改、删除触发器的方法。 4.掌握利用触发器维护数据完整性的方法。 1.验证性实验:某同学定义产品信息product表,并对其触发器创建与管理 2.设计性试验:某同学定义产品信息product表,并对其

    2024年02月04日
    浏览(35)
  • 【MySQL触发器】触发器的使用、创建、修改及删除

    一、什么是触发器 二、创建触发器 ①创建一个insert事件触发器 ②创建一个delete 事件触发器  三、触发器包含多条执行语句 四、查看触发器  ①SHOW TRIGGERS语句查看触发器 ②查看系统表triggers实现查看触发器   五、触发器的删除       当我们对一个表进行数据操作时,需

    2023年04月08日
    浏览(39)
  • MySQL | MySQL触发器

    目录 一、创建触发器 1.2 创建只有一个执行语句的触发器 1.2 创建有多个执行语句的触发器 二、查看触发器 2.1 利用SHOW TRIGGERS语句查看触发器信息 2.2 在triggers表中查看触发器信息 三、删除触发器 触发器是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,

    2024年02月14日
    浏览(28)
  • 数据库触发器简介——修改数据的触发器、删除数据的触发器

    修改数据的触发器 更新数据 思考下面这个触发器会触发几次?几条数据就触发几次。

    2024年02月15日
    浏览(37)
  • MySQL 触发器

    触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。 使用别 名OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库

    2024年02月08日
    浏览(30)
  • MySQL进阶——触发器

    同存储过程和函数类似,MySQL中的触发器也是存储在系统内部的一段程序代码,可以把它看作是一个特殊的存储过程。所不同的是,触发器无需人工调用,当程序满足定义条件时就会被MySQL自动调用。这些条件可以称为触发事件,包括INSERT、UPDATE和DELETE操作。 从MySQL5.7开始,可

    2024年02月04日
    浏览(33)
  • MySQL-触发器

    目录 🍁触发器简介 🍁创建触发器 🍃创建 BEFORE 类型触发器 🍃创建 AFTER 类型触发器 🍁删除触发器(DROP TRIGGER) 🍃删除触发器 🍁语法总结 🍃insert 🍃delete 🍃update 🦐:MySQL专栏         MySQL 数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用 CAL

    2024年01月16日
    浏览(32)
  • 【MySQL进阶】MySQL触发器详解

    序号 系列文章 7 【MySQL基础】运算符及相关函数详解 8 【MySQL基础】MySQL多表操作详解 9 【MySQL进阶】MySQL事务详解 10 【MySQL进阶】MySQL视图详解 大家好,我是小杨!前面我已经为大家介绍了MySQL中的进阶知识-视图,那么今天我们就给大家讲解MySQL中的触发器这部分的相关内容,

    2024年02月03日
    浏览(39)
  • MySQL---存储函数、触发器

    1. 存储函数 MySQL 存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算 或功能写成一个函数。 存储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合。 存储函数与存储过程的区别: 存储函数有且只有一个返回值,而存储过程可

    2024年02月05日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包