精华内容
下载资源
问答
  • 近期接受项目需求,需要实时处理oracle数据库数据变化,首先想到的是在程序中创建定时器,轮询。鉴于程序冗余考虑,百度知:oracle数据库java存储过程。Oracle数据库有执行简单java代码的能力,想到一套新的...

    近期接受项目需求,需要实时处理oracle数据库中表的数据变化,首先想到的是在程序中创建定时器,轮询表。鉴于程序冗余考虑,百度知:oracle数据库java存储过程。Oracle数据库有执行简单java代码的能力,想到一套新的解决思路。

             思路:创建oracle数据库触发器,当表的数据发生变化的时候,触发器调用oracle数据库java存储过程,该过程调用程序中的接口,告知程序处理逻辑业务。

    实现

    1. 在plsqldev 中编译java代码 调用接口(具体的语法百度即可) 访问地址是:http://192.168.12.57:8088/Jfinaltest/show

    create or replace and compile java source named jxdClient as
    
    import java.net.*;
    
    public class Demo {
      
      public static void main(String[] args) {
    
        try {
          URL url = new URL("http://192.168.12.57:8088/Jfinaltest/show");
          URLConnection rulConnection = url.openConnection();
          rulConnection.connect();
          rulConnection.getInputStream();
        } catch (Exception e) {
          e.printStackTrace();
        }  
      }
    }

    2. 生成存储过程

    create or replace procedure prc_hehe as language java name 'Demo.main(java.lang.String[])';

    3. 编写触发器调用存储过程(pre_hehe)


    create or replace trigger jxd7_trigger_wf_nodeinstance
    after update or insert
    on jxd7_wf_nodeinstance
    for each row
    begin
      if inserting then
        prc_hehe;
      elsif updating then
        prc_hehe;
      elsif deleting then
        prc_hehe;
      end if;
    end;

    小结:每次表中的数据发生变化的时候,都会执行触发器中的存储过程,存储过程会调用程序的接口,之后程序处理业务逻辑。减少了代码量,保证了数据处理的实时性,减少了程序的压力



    展开全文
  • Canal监控数据库数据变化

    千次阅读 2020-01-09 17:05:31
    最近有需求需要监控数据库mysql里某些数据变化,来做相应的业务变化,采用了 canal+kafka 的技术架构。官网github指导很全面 原理: 将canal server接收到的binlog数据直接投递到MQ, 目前默认支持的MQ系统有...

    最近有需求需要监控数据库mysql里某些表的数据变化,来做相应的业务变化,采用了 canal+kafka 的技术架构。官网github指导很全面

    原理:

    将canal server接收到的binlog数据直接投递到MQ, 目前默认支持的MQ系统有 kafka 和 RocketMQ

    安装:

    zk

    安装简单,就是解压修改配置zoo.cfg, 主要是端口(默认2181),log 和data 目录配置,是否集群根据情况来

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/usr/local/zookeeper/data
    dataLogDir=/usr/local/zookeeper/logs
    clientPort=2181
    # 集群添加
    server.1=192.168.1.110:2888:3888
    server.2=192.168.1.111:2888:3888
    server.3=192.168.1.112:2888:3888
    
    #master
    echo "1">/usr/local/zookeeper/data/myid
    #slave1
    echo "2">/usr/local/zookeeper/data/myid
    #slave2
    echo "3">/usr/local/zookeeper/data/myid

    安装后看是否需要添加环境变量,然后测试是否安装成功

     kafka

    wget https://www.apache.org/dyn/closer.cgi?path=/kafka/1.1.1/kafka_2.11-1.1.1.tgz
    # 下载后解压,主要修改配置文件 server.properties 
    # kafka 是需要依赖zookeeper的,需要配置zk地址
    #然后配置监听端口
    zookeeper.connect=192.168.1.110:2181
    listeners=PLAINTEXT://:9092
    advertised.listeners=PLAINTEXT://192.168.1.117:9092 #本机ip

    安装后自己先测试一下,生产和消费,如果集成springboot , 这里先简单测试,看是否一切正常,最后再测试canal

    canal

    官网github 下载压缩包,安装后conf目录内包含

    其中 canal.properties 和 example/instance.properties 配置需要修改

    instance.properties

    #  按需修改成自己的数据库信息
    #################################################
    ...
    canal.instance.master.address=192.168.1.20:3306
    # username/password,数据库的用户名和密码
    ...
    canal.instance.dbUsername = canal
    canal.instance.dbPassword = canal
    ...
    # table regex 需要监控的表名,多个逗号隔开
    canal.instance.filter.regex=mytest.user
    # mq config
    #canal.mq.topic=example
    # 针对库名或者表名发送动态topic
    canal.mq.dynamicTopic=mytest,.*,mytest.user,mytest\\..*,.*\\..*
    canal.mq.partition=3
    # hash partition config
    #canal.mq.partitionsNum=3
    #库名.表名: 唯一主键,多个表之间用逗号分隔
    #canal.mq.partitionHash=mytest.person:id,mytest.role:id
    #################################################
    #canal.mq.dynamicTopic 表达式说明
    #canal 1.1.3版本之后, 支持配置格式:schema 或 schema.table,多个配置之间使用逗号或分号分隔
    #
    #例子1:test\\.test 指定匹配的单表,发送到以test_test为名字的topic上
    #例子2:.*\\..* 匹配所有表,则每个表都会发送到各自表名的topic上
    #例子3:test 指定匹配对应的库,一个库的所有表都会发送到库名的topic上
    #例子4:test\\.* 指定匹配的表达式,针对匹配的表会发送到各自表名的topic上
    #例子5:test,test1\\.test1,指定多个表达式,会将test库的表都发送到test的topic上,test1\\.test1的表发送到对应的test1_test1 topic上,其余的表发送到默认的canal.mq.topic值
    #为满足更大的灵活性,允许对匹配条件的规则指定发送的topic名字,配置格式:topicName:schema 或 topicName:schema.table
    #
    #例子1: test:test\\.test 指定匹配的单表,发送到以test为名字的topic上
    #例子2: test:.*\\..* 匹配所有表,因为有指定topic,则每个表都会发送到test的topic下
    #例子3: test:test 指定匹配对应的库,一个库的所有表都会发送到test的topic下
    #例子4:testA:test\\.* 指定匹配的表达式,针对匹配的表会发送到testA的topic下
    #例子5:test0:test,test1:test1\\.test1,指定多个表达式,会将test库的表都发送到test0的topic下,test1\\.test1的表发送到对应的test1的topic下,其余的表发送到默认的canal.mq.topic值
    #大家可以结合自己的业务需求,设置匹配规则,建议MQ开启自动创建topic的能力
    #
    #canal.mq.partitionHash 表达式说明
    #canal 1.1.3版本之后, 支持配置格式:schema.table:pk1^pk2,多个配置之间使用逗号分隔
    #
    #例子1:test\\.test:pk1^pk2 指定匹配的单表,对应的hash字段为pk1 + pk2
    #例子2:.*\\..*:id 正则匹配,指定所有正则匹配的表对应的hash字段为id
    #例子3:.*\\..*:$pk$ 正则匹配,指定所有正则匹配的表对应的hash字段为表主键(自动查找)
    #例子4: 匹配规则啥都不写,则默认发到0这个partition上
    #例子5:.*\\..* ,不指定pk信息的正则匹配,将所有正则匹配的表,对应的hash字段为表名
    #按表hash: 一张表的所有数据可以发到同一个分区,不同表之间会做散列 (会有热点表分区过大问题)
    #例子6: test\\.test:id,.\\..* , 针对test的表按照id散列,其余的表按照table散列
    #注意:大家可以结合自己的业务需求,设置匹配规则,多条匹配规则之间是按照顺序进行匹配(命中一条规则就返回)

    canal.properties

    # ...
    # 可选项: tcp(默认), kafka, RocketMQ
    canal.serverMode = kafka
    # ...
    # kafka/rocketmq 集群配置: 192.168.1.117:9092,192.168.1.118:9092,192.168.1.119:9092 
    canal.mq.servers = 127.0.0.1:6667
    canal.mq.retries = 0
    # flagMessage模式下可以调大该值, 但不要超过MQ消息体大小上限
    canal.mq.batchSize = 16384
    canal.mq.maxRequestSize = 1048576
    # flatMessage模式下请将该值改大, 建议50-200
    canal.mq.lingerMs = 1
    canal.mq.bufferMemory = 33554432
    # Canal的batch size, 默认50K, 由于kafka最大消息体限制请勿超过1M(900K以下)
    canal.mq.canalBatchSize = 50
    # Canal get数据的超时时间, 单位: 毫秒, 空为不限超时
    canal.mq.canalGetTimeout = 100
    # 是否为flat json格式对象
    canal.mq.flatMessage = false
    canal.mq.compressionType = none
    canal.mq.acks = all
    # kafka消息投递是否使用事务
    canal.mq.transaction = false

    启动后观看日志是否正常,日志文件有两处,

    logs/canal/canal.log
    logs/example/example.log

    然后查看kafka 消费情况  得到的消息如下

    新增
    {
    	"data": [{
    		"id": "10028",
    		"name": "18676671234",
    		"account": "18676671234",
    		"password": "e10adc3949ba59abbe56e057f20f883e",
    		"status": "Y"
    	}],
    	"database": "dyly_vc",
    	"es": 1563764670000,
    	"id": 6,
    	"isDdl": false,
    	"mysqlType": {
    		"id": "bigint(20)",
    		"name": "varchar(255)",
    		"account": "varchar(255)",
    		"password": "varchar(255)",
    		"status": "varchar(10)"
    	},
    	"old": null,
    	"pkNames": ["id"],
    	"sql": "",
    	"sqlType": {
    		"id": -5,
    		"name": 12,
    		"account": 12,
    		"password": 12,
    		"status": 12
    	},
    	"table": "back_user",
    	"ts": 1563764670842,
    	"type": "INSERT"
    }
    修改
    {
    	"data": [{
    		"id": "10027",
    		"name": "修改名字",
    		"account": "18126239509",
    		"password": "e10adc3949ba59abbe56e057f20f883e",
    		"status": "Y"
    	}],
    	"database": "dyly_vc",
    	"es": 1563764853000,
    	"id": 19,
    	"isDdl": false,
    	"mysqlType": {
    		"id": "bigint(20)",
    		"name": "varchar(255)",
    		"account": "varchar(255)",
    		"password": "varchar(255)",
    		"status": "varchar(10)"
    	},
    	"old": [{
    		"name": "测试"
    	}],
    	"pkNames": ["id"],
    	"sql": "",
    	"sqlType": {
    		"id": -5,
    		"name": 12,
    		"account": 12,
    		"password": 12,
    		"status": 12
    	},
    	"table": "back_user",
    	"ts": 1563764853305,
    	"type": "UPDATE"
    }
    
    删除
    {
    	"data": [{
    		"id": "10028",
    		"name": "18676671234",
    		"account": "18676671234",
    		"password": "e10adc3949ba59abbe56e057f20f883e",
    		"status": "Y"
    	}],
    	"database": "dyly_vc",
    	"es": 1563764949000,
    	"id": 27,
    	"isDdl": false,
    	"mysqlType": {
    		"id": "bigint(20)",
    		"name": "varchar(255)",
    		"account": "varchar(255)",
    		"password": "varchar(255)",
    		"status": "varchar(10)"
    	},
    	"old": null,
    	"pkNames": ["id"],
    	"sql": "",
    	"sqlType": {
    		"id": -5,
    		"name": 12,
    		"account": 12,
    		"password": 12,
    		"status": 12
    	},
    	"table": "back_user",
    	"ts": 1563764949610,
    	"type": "DELETE"
    }

     

    展开全文
  • 监控数据库表变化

    千次阅读 2014-02-14 15:54:26
    CREATE PROCEDURE usr_run_1 AS ...数据名叫 ais201401211429,创建了一个a99 字段 tab_name,first_run,second_run 先运行 usr_run_1,然后添加一条记录,再运行usr_run_2 就\在a99中就可以看到先后的不同
    CREATE PROCEDURE  usr_run_1 AS
    declare @name  varchar(50)
    declare @id  int
    declare @count int
    declare @sql nvarchar(255)
    select id,name  into #tmp20140215  from sysobjects where type='u' order by name
    select @count=count(*) from #tmp20140215
    print cast (@count as varchar(10))
    while exists(select * from #tmp20140215)
    begin
             select @id=id,@name=name from #tmp20140215
          --   usr_run_2 @name, @count output
             set @sql='use ais20140121142916 select @count=count(*) from ' +@name
              exec master.dbo.sp_executesql @sql,N'@count int output',@count output
              insert into a99 (tab_name,first_run) values (@name,@count)
             
             delete from #tmp20140215 where id=@id
             
    end


    select @count=count(*) from a99

    print cast (@count as varchar(10))


    CREATE PROCEDURE usr_run_2 AS


    declare @name  varchar(50)
    declare @id  int
    declare @count int
    declare @sql nvarchar(255)
    select id,name  into #tmp201402151  from sysobjects where type='u' order by name
    while exists(select * from #tmp201402151)
    begin
             select @id=id,@name=name from #tmp201402151
          --   usr_run_2 @name, @count output
             set @sql='use ais20140121142916 select @count=count(*) from ' +@name
              exec master.dbo.sp_executesql @sql,N'@count int output',@count output
             -- insert into a99 (tab_name,first_run) values (@name,@count)
              update a99 set second_run=@count where tab_name=@name
             
             delete from #tmp201402151 where id=@id
             
    end


    数据名叫 ais201401211429,创建了一个表a99   字段 tab_name,first_run,second_run

    先运行 usr_run_1,然后添加一条记录,再运行usr_run_2

    就\在a99中就可以看到先后的不同

    展开全文
  • 一、分别安装vue和node对应的socket.io cnpm intsall socket.io -save cnpm install vue-socket.io -save ...:实时监控策略是定时查询数据,发现数据有变化时,发送给前端 ...修改数据库数据:  

    一、分别安装vue和node对应的socket.io

    cnpm intsall socket.io -save
    
    cnpm install vue-socket.io -save

    二、前端socket配置

    1、main.js引入socket,并连接3000端口

    import vue_socket from 'vue-socket.io'
    
    Vue.use(vue_socket, 'http://127.0.0.1:3000')
    

    2、在组件中配置

    <template>    
            <ul>
               <li v-for="user in users">
                   {{user.name}}
               </li> 
            </ul>
    </template>
    <script>  
        export default {
            name: 'Test',
            data () { 
                return {
                    users:[]
                }
            },  
            sockets:{//不能改
                    connect:function() {//与socket.io连接后回调
                        console.log('socket connected');
                    }, 
                    message:function(value) { 
                        var json_value=JSON.parse(value);//将结果转为json格式 
                        this.users=[];
                        var _this=this;
                        json_value.forEach(function(item,index){
                            _this.users.push({
                                'name':item.FIRST_
                            });
                        });
                    }
            }, 
            methods:{ 
                initSocket(){ //初始化weosocket   
                    this.$socket.emit("message", {}); //向服务端发送信息
               }, 
            },
            created: function () { 
                this.initSocket();  
            },
                 
            //所有视图都加载后,再调用图表方法
            mounted(){
                this.$nextTick(function() {
                  var _this=this; 
                })
            }
        }
    </script>
    <style scoped> 
    </style>

    三、后端socket配置:实时监控策略是定时查询数据,发现数据有变化时,发送给前端

    // node 后端服务器
    const db=require('./db.js');
    
    const mysql=require('mysql');
    const express = require('express'); 
    const app = express();
    app.use(express.static('../dist'));    
    var server = require('http').createServer(app);
    var io = require('socket.io')(server); 
    
    var conn=mysql.createConnection(db.mysql);
    conn.connect();
    
    io.on('connection', function(socket){
     	console.log('a user connected'); 
    
        socket.on("disconnect", function() {
            console.log("a user go out");
        });
    
        socket.on("message", function(obj) { 
    		let sql="select FIRST_ from act_id_user"; 
    		let resultStr,resultjson; 
    		conn.query(sql, function(err, result) { 
    		        if (err) {
    		            console.log(err);
    		        }
    		        if (result) {  
    	        		resultjson = JSON.stringify(result);
    	        		resultStr=resultjson;  
    					io.emit("message", resultjson);  
    		        }
    	    });
    
    	    setInterval(function(){
    			conn.query(sql, function(err, result) { 
    		        if (err) {
    		            console.log(err);
    		        }
    		        if (result) {  
    	        		resultjson = JSON.stringify(result); 
    		            if(resultStr!=resultjson){  
    						resultStr=resultjson;
    						io.emit("message", resultStr); 
    		            }	    
    		        }
    		    })
    		},3000); 
    
        }); 
    });
    
    // 监听端口
    server.listen(3000);
    console.log('success listen at port:3000......');

    四、浏览器打开 http://localhost:8080/#/test

    修改数据库数据:

     

    展开全文
  • 原理:canal监控mysql的数据库数据变化是根据数据库的binlog来监控的。 问题描述: 使用canal监控mysql数据库数据变化时,总是监控不到。 解决: 一路排查问题,确认不是其它问题后,去确认vim /etc/my.cnf 这个...
  • 中如果有新数据时,前台页面自动调用查询方法显示新数据!插入方法不在java程序中,由硬件方式插入!
  • //依赖是基于某一张的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[] using (SqlCommand command = new SqlCommand("select D_Id,D_Name,D_Password,D_Else,D_Amount From ...
  • websocket实现监听数据库表数据

    千次阅读 2018-08-09 11:18:07
    1 大概思路: 需要定义一个触发器(当中的数据变化的时候触发器去触发程序,程序---去调用,或者直接向websocket传入值,-------&gt;websocket程序------返回给前端) 2 不监听数据库,而是监听程序,凡是对...
  • 实时监控mysql数据库变化

    万次阅读 2012-04-16 16:32:29
    还没有发现比较好用的监控数据库变化监控软件。 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1、打开数据库配置文件my.ini (一般在数据库安装目录)(D:\MYSQL) 2、在数据库的最后一行添加...
  • SqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的。 场景:当数据库中的数据发生变化时,需要...
  • 如果你要同步不同数据库之间的数据,首先会想到的是数据库复制技术,但如果让你同步数据库的结构,你会想到什么呢? 下面是一个例子,用来说明通过sql server中的DDL触发器,来记录create table、alter table、...
  • java实时监控mysql数据库变化

    千次阅读 2019-10-05 19:44:42
    还没有发现比较好用的监控数据库变化监控软件。 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1、打开数据库配置文件my.ini (一般在数据库安装目录)(D:\MYSQL) 2、在数据库的最后一行添加...
  • sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. 快速上手可参见园友的下列文章 ...
  • 通过java实时查询数据库好像会影响查询效率,搜索网上资料,说最好使用数据库自己的触发器,用于监控数据库表变化。 缺点是:触发器在数据库后台执行,维护困难,很有可能被忽略。 搜了半天资料,整理如下。 --...
  • Python+java+websocket+SpringMVC实时监控数据库中的

    千次阅读 多人点赞 2019-09-05 09:49:24
    Python+java+websocket+SpringMVC实时监控数据库中的 为什么要对数据库中的进行实时的监控? 做数据展示你可能会想到ajax,做实时数据展示你可能会想到定时器+ajax。 定时器+ajax可能会造成:如果到一个指定的...
  • 将A服务器的sql server数据库item_mst数据同步到MySQL数据库Part 监控Item_mst中item,description,overview 的更改并同步到MySQL数据库 针对需求一,基本就是执行一次,单独写了个winform用来做这事 ...
  • 但是当程序往数据库里增加或者更新数据时,就要同时更新缓存,如下图 当缓存很多,并且如果业务创建缓存的地方分散在各个功能,各个文件里时,很容易导致有些缓存忘记更新,从而导致一些业务上的错误,而这些错误很...
  • 自定义监听器监听数据库数据变化 链接:https://blog.csdn.net/daditao/article/details/20463503
  • 在网上很难找到ContentObserver的使用说明,大多都是监控系统的数据库变化,或者很多文章都是ContentProvider和ContentObserver一起说明,导致内容很多,很乱。那问题来了,我们如何新建自己的ContentObserver来...
  • android数据库数据变化监听

    千次阅读 2015-06-19 12:17:32
    感谢一下两位同仁的文章: http://www.it165.net/pro/html/201406/15368.html http://www.blogjava.net/zhaojianhua/archive/2011/10/27/362204.html
  • 利用CDC,在对源表进行insert、update或delete等操作的同时就可以提取数据,并且变化的数据被保存在数据库变化表中。这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给目标系统。CDC体系...
  • 利用oracle审计功能来监测试环境的变化 做过测试的人都应该会碰到这样的情况:测试发现的bug在开发机器上没有出现,显然这是环境差异的原因。相当多情况下,因为测试使用的数据库结构和开发使用的数据库结构不一致...
  • SqlDependency提供了这样一种机制,当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的。 首先要对数据库进行配置,配置命令...
  • 一 开启mysql数据库bin_log 打开数据库my.ini配置文件添加以下代码重启mysql log_bin=mysql-bin binlog-format=ROW server-id=1 在https://github.com/下载Canla deployer部署包,canal是源码包 解压打开conf/...
  • 数据库, 数据仓库, 数据集市,数据湖,数据中台

    千次阅读 多人点赞 2019-02-22 16:21:47
    转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: 数据仓库和数据集市的区别 ...本文简要介绍数据库 数据仓库和数据集市概念,并做简要对比。 0x01 数据仓库和数据库 1.1 数...
  • 实现思想:  1.java在后台建立一个websocket,页面与此socket建立连接,  2.写一个jar程序,当运行时与socket...数据库建立insert触发器,当插入数据时调用外部jar程序 环境:jdk7,tomcat7,sqlserver,windows
  • 我现在要做一个监控业务数据的系统,定时去检测某一表数据的增量情况(每5分钟,每10分钟,每30分钟,趋势图),我怎么设计好呢? 我想到的是肯定需要把数据计算好,并且持久化存储下来 现在数据库就是用mysql,然后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,237
精华内容 46,094
关键字:

如何监控数据库表数据变化