1、前言:

最近项目准备上线,要先做一下并行,所以要把调用接口的请求 请求到生产环境的同时也请求到并行环境。我刚开始,写了一个程序,多线程去生产数据库(接口有记录表,记录请求报文)取到请求报文,然后再拼接成curl请求命令,请求到并行环境,结果跑了没半天就差点儿把生产数据库搞挂。原因是,我的程序每五分钟调用一次,调用会获取11个数据库连接,结果因为生产上数据量大,五分钟没有处理完成,另一个调度就调起来了,这样一下午累积下来,产生了上百个连接,生成cpu飙到了%90以上,触发了告警,领导收到了告警短信才发现了问题。
之后应领导要求,我的并行程序不能直接连接生产库,需要异步处理(需要数据库做中转),那么就涉及到一个如何获取生产数据库中的报文数据的问题。通过上网查询,大体有三个方案:

1.1 使用触发器

在接口报文记录表上添加一个触发器,每次请求的报文插入生产记录表的同时触发器插入到中转数据库。
优点:编程简单,只需要几行
缺点:会影响生产数据库性能,同时该触发器需要配合dblink,可能存在潜在危险。

-- 一个简单的oracle触发器
CREATE OR REPLACE TRIGGER MY_TGR
BEFORE INSERT ON jd.ims_json_soap_1_0
FOR EACH ROW--对表的每一行触发器执行一次,插入test_b的同时插入test_a
BEGIN
insert into cd.ims_json_soap_1_0(name,age,school,home,ext)  values(:NEW.name,:NEW.age,:NEW.school,:NEW.home,:NEW.ext);
END;
1.2 使用canal

canal是阿里巴巴提供的一个开源工具,通过监听数据库binlog日志,解析出语句,然后执行,该程序对于mysql很友好,但是oracle(归档日志)貌似支持部分.太新的版本应该还不支持,这个还没有尝试。

1.3 使用kettle

kettle是一款国外的开源ETL工具,使用的时候只需要下载解压就可以使用,数据抽取速度可以达到每秒上万条数据的同步。

2、kettle的使用

2.1 下载安装kettle

我这里使用的是pdi-ce-7.1.0.0-12

2.2 表同步生成ktr文件

因为生产数据是实时有调用记录插入的,所以我的同步方案是增量同步。
通过目标表的最新时间到生产源表里面获取最新的记录

2.2.1 最终转换效果

2.2.2 MaxDate

获取目标表(中转数据库中的表)最大时间做为一个表输入。

2.2.3 常规(生产数据库)

注意下面的从步骤插入数据,sql语句中的问号会在执行的时候替换为下面的MaxData(该名字需要和上一步中的步骤名称保持一致)

2.2.4 表输出

这里其实还可以使用 插入/更新 但是这种方式相对慢一些,但是更灵活,可以自定义同步的字段,由于我这里表结构都是相同的,所以我采用表输出的方式,这样的效率更高。


最后按住shirt通过拖拉将两个输入和一个输出连接起来就可以了

我这里应为分表的关系有十张分表都需要同步,所以我复制了十个这样的转换。

2.3 执行ktr文件


转换过程

3、java整合kettle,通过程序调用执行ktr文件

由于我的需要放在服务器上去定时调度,所以我采用的是Java + crontab的方式实现的定时调度执行ktr文件。

   /*** 执行ktr文件* @param args*/public static void main(String[] args) throws KettleException {//初始化ketlleKettleEnvironment.init();//创建转换元数据对象//TransMeta meta = new TransMeta("etl/update_insert_Trans.ktr");TransMeta meta = new TransMeta("D:\\Tools\\Kettle\\save\\常规到紧急0分表.ktr");Trans trans = new Trans(meta);trans.prepareExecution(null);trans.startThreads();// 等待执行完成trans.waitUntilFinished();if(trans.getErrors()!=0){System.out.println("执行失败!");}}

数据库表同步的三种方法相关推荐

  1. unix c线程同步的三种方法:互斥量、读写锁以及条件变-xhb8413-ChinaUnix博客

    unix c线程同步的三种方法:互斥量.读写锁以及条件变-xhb8413-ChinaUnix博客 unix c线程同步的三种方法:互斥量.读写锁以及条件变 2012-03-30 14:42:38 分类 ...

  2. 关系型数据库横向扩展的三种方法

    本文是 Oracle Coherence 3.5一书,第一章: Achieving Performance, Scalability, and Availability Objectives,第二节: ...

  3. MySQL数据库修改名称的三种方法

    第一种方法: RENAME database olddbname TO newdbname 这个是5.1.7到5.1.23版本可以用的,但是官方不推荐,会有丢失数据的危险 第二种方法: 1.创建需要改 ...

  4. VS中C#读取app.config数据库配置字符串的三种方法(转)

    关于VS2008或VS2005中数据库配置字符串的三种取法 VS2008建立Form程序时,如果添加数据源会在配置文件 app.config中自动写入连接字符串,这个字符串将会在你利用DataSet, ...

  5. mysql数据库导入到excel表格数据_[转载]将EXCEL表格中的数据导入mysql数据库表中(两种方法)...

    今天项目上遇到需要将excel中的数据导入到数据库的classify表中,于是乎拼命上网查阅方法,发现以下两种方法比较可行: 在此之前先说说按照网上的说法我没有试验成功的方法,将excel文件xls保 ...

  6. mysql数据没有同步更新_解决MySQL的主从数据库没有同步的两种方法

    问题 今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. show master statu ...

  7. 把EXCEL表格导入到MYSQL中_将EXCEL表格中的数据导入mysql数据库表中(两种方法)...

    今天项目上遇到需要将excel中的数据导入到数据库的classify表中,于是乎拼命上网查阅方法,发现以下两种方法比较可行: 在此之前先说说按照网上的说法我没有试验成功的方法,将excel文件xls保 ...

  8. linux c 线程同步的三种方法

    目录 一.互斥锁(mutex) 二.条件变量(cond) 三.信号量(sem) 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用 ...

  9. Linux 线程同步的三种方法

    程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同 ...

最新文章

  1. NAT环境无法访问云端的深层次分析
  2. php PDO 浮点数返回,php – 如何在PDO中简单地返回对象?
  3. boost::hof::always用法的测试程序
  4. 用于JMX访问的Apache Ant任务
  5. python避坑指南_Linux下Python3.6的安装及避坑指南
  6. centos mysql 主从_Centos下MySQL主从同步配置
  7. matlab 2017a安装教程
  8. java snmp mib库接收_SNMP MIB 功能开发详细步骤
  9. 计算机优秀毕业生访谈,访谈 | 信息院优秀毕业生经验分享
  10. 1926. Nearest Exit from Entrance in Maze刷题笔记
  11. VS C++项目报错warning C4199: ……use /Zc:twoPhase-
  12. 小程序 腾讯兔小巢 对接
  13. Eclipse如何调试代码
  14. SyntaxError: Unexpected token u in JSON at position 1
  15. unity中Input.Touch详解
  16. 2023年节假日JSON
  17. 步进电机--S 曲线的C算法
  18. python numpy读取数据_python机器学习(七)数据分析利器,NumPy,pandas与Matplotlib
  19. 爬虫初上手之爬取QQ音乐!
  20. 主控是sm2259xt,求量产工具,固态硬盘是七彩虹sl500 250G的

热门文章

  1. JNU-数电实验一-初识Multisim和Basys3
  2. Qt QNetworkAccessManager 下载url
  3. 京东云无线宝可以服务器吗,京东云无线宝哪种上网方式收益最高,这点你一定得知道...
  4. 大数据时代医疗大数据建设,主要存在哪些问题?
  5. java.lang.IllegalArgumentException: Illegal URL:
  6. VsCode:设置前进和后退 (返回上一个浏览位置/下一个浏览位置)快捷键
  7. 需求:定义老师和学生类,然后写代码测试;最后找到老师类和学生类当中的共性内容,抽出一个父类,用继承的方式改写代码,并进行测试
  8. 销售人员面对陌生客户时的谈话技巧
  9. 在PYNQ-Z2上移植RISC-V
  10. 一个IT人才的精彩故事