对比数据的痛苦

不知道你是否也像我一样,在快乐编写代码的时候,必须进行一些数据库的数据对比工作。

诚然,一般的数据差异,比如是每一行的内容不同,市场上有比较成熟的 compare2 等对比工具。

但是如果是对比数据的每一列是否相同,这个就会变得比较麻烦。

对比v1.0 纯人工对比

我们在做一些数据迁移等功能时,经常需要对比数据是否正确,最常见的方法就是人工一列一列的对比。

一开始老马也是这么和同事对的,对了几天之后感觉效率实在是低,而且还容易看花眼。

于是我就是琢磨,这个东西用程序对比应该会简单很多。

v2.0 半人工对比

说干就干,我花半天时间实现了一个基于 jsqlparser 可以解析类似于 的工具类。

然后对比 2 边的数据,这下对于一张表上百个字段的对比,一些变得快了许多,准确率也高了很多。

不要问我为什么会有上百个字段,这都是历史沉淀下来的瑰宝。。。

ps: insert into 语句是否通过数据库连接工具手工导出的。

后来又发现另一个问题:表太多,如果想换一个数据对比,我手工导出一遍又要花费数十分钟的时间,关键是重复且枯燥。

枯燥

既然重复,那么可以使用程序实现吗?

v3.0 对比基本自动化

于是我下班后熬夜实现了这个版本:java 程序实现了数据的导出持久化,然后进行修改前后的差异对比。

下面我分享一下自己的思路,以及核心源码,文末有下载福利。

希望对你工作和学习提供帮助。

整体理念

我希望这个工具是 MVP 的理念,由简单到复杂,后期逐渐丰富特性。

要有可拓展性,目前支持 mysql/oracle/sql server 等主流数据库,用户可以定制化开发。

尽可能少的依赖,使用原生的 jdbc,不需要引入 mybatis 等框架。

核心依赖

下面列举一下我用到的核心依赖:

fastjson 用于数据持久化为 json

mysql-connector-java 数据库连接驱动

jsqlparser 辅助工具,解析 sql 使用,非必须

实现思路

根据指定的 jdbc 连接信息,自动选择对应的 jdbc 实现。

执行对应的 sql,将结果解析为 map,进行 JSON 持久化

对持久化的 json 进行差异对比,展现出差异结果

有了这个思路,一切就会变得朴实无华。

当然在此之前,需要我们把代码实现出来,下面进入写BUG环节:

写BUGjdbc 实现核心接口

考虑到后期不同数据库实现,我们统一定义一个查询接口

抽象实现

这里提供了基本的抽象实现。

子类只需要实现对应的连接获取信息即可。

JdbcVo 连接信息

这个对象主要是数据库连接信息对象:

mysql 实现

此处以 mysql 为例:

这里主要是对连接的初始化,连接不同的数据库,都需要引入对应的数据源。

行数据导出实现

下面是导出的核心实现:

接口定义

这里指定了需要执行的 sql。

context 中为了便于后期拓展,目前只有 JdbcMapper。

返回的就是 QueryResultVo,就是查询结果,定义如下:

默认实现

默认的导出实现如下:

其实实现非常简单,我们主要讲一下两点:

(1)表名称

mysql 经测试可以通过如下方式获取:

oracle 我在测试的时候,发现无法获取。所以是借助 sqlparser 解析我们的查询语句得到的。

暂时主要是支持查询,所以这里写的有些固定了,后续可以优化一下。

(2)列信息

每一个查询,可能都对应多条记录。

我们看一下每一条记录的构建:

这个经常写 jdbc 的小伙伴也一定不陌生。

你说现在都用 mybatis 了,谁还写 jdbc 啊,这么 low。

那么,你自己手写一个 mybatis,这些也是必会的。

差异对比

导出的使用

我们可以把一行数据导出,可以在修改前后分别导出。

如果是导出到不同的库,不同的表,那么就进行不同库表之间的导出。

导出结果之后,就需要进行对比了。

对比实现

接口定义

对于导出结果的处理,你可以根据自己的实际情况自行选择。

比如导出为 csv/json/insert 等,对比差异也可以按照自己的需求定制。

持久化

此处介绍一种比较简单实用的方式:json 持久化。

我们将行数据持久化到文件中,注意这里指定了 ;

这样可以让 null 字段也输出,更加方便对比。

文件差异对比实现

上面我们假设将文件输出到 2 个文件,下面指定文件路径就可以进行对比了:

这里将差异内容,直接 console 控台输出。

文件夹

当然,我们也可以对比两个文件夹下的内容。

实现如下:

引导类

便利性

上面我们把核心实现都搞定了,但是用户使用起来还是不够方便。因为配置等不够优雅。

所以我们引入引导类,帮助用户快速使用:

这里为用户提供了 mysql 最基本的配置,以及常用的查询处理方法。

测试

下面我们来看一下测试的效果:

直接查询

查询并处理

两次导出可以指定文件路径,比如分别是:

针对两次结果对比

差异结果就会被输出到控台。

结果

一切顺利,不过革命尚未成功,同学仍需加班呀~~~

不足之处

这是一个 v0.0.1 版本,还有很多不足。

比如:

导出为 csv

导出为 insert/update 语句

导出的文件名称自定义策略

可以指定多个 sql 是否生成在同一个文件中

导出路径根据操作系统,自动变更

更加便于使用,比如页面指定数据源+sql,页面显示对应差异结果。

不过也基本可用,符合我们最初的设想。

小结

不知道你平时又是如何对比数据的呢?

希望本文对你有帮助,如果有其他想法的话,也可以评论区和大家分享哦。

各位极客的点赞收藏转发,是老马持续写作的最大动力!

mysql 连接差异_和你一起从 0 实现一个数据库差异对比工具相关推荐

  1. 微服务 mysql 连接池_【mysql】druid,连接池和微服务的问题

    我所知道的 druid 配置,是在一个服务上进行配置 假如一台机器上装有 mysql 当我们用连接池去连接的时候 根据 https://blog.csdn.net/w059805- 说法 连接池的大小 ...

  2. jet mysql连接字符串_数据库连接字符串大全

    MySQL 连接方式----------- MySQL Connector/ODBC 2.50 (MyODBC 2.50)连接方式 本地数据库连接 Driver={mySQL};Server=loca ...

  3. mysql 连接 优化_(一)MySQL 连接优化

    1.查看连接参数(show variables) mysql> show variables like '%connect%'; +------------------------------- ...

  4. mysql连接池_基于Swoole的通用连接池 - 数据库连接池(life)

    open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖版本PHP>=7.0.0Swoole>=4.2.9Recommend ...

  5. mysql连接池_数据库技术:数据库连接池,Commons DbUtils,批处理,元数据

    Database Connection Pool Introduction to Database Connection Pool 实际开发中"获得连接"或"释放资源&q ...

  6. mysql链接出错_请配置/amysql/config.php文件_MySQL数据库之PHP连接mysql时mysql_connect()函数不可用...

    本文主要向大家介绍了MySQL数据库之PHP连接mysql时mysql_connect()函数不可用 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 我在搭建环境时也没有再安装m ...

  7. swoole mysql 连接池_基于Swoole的通用连接池 - 数据库连接池

    连接池 open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖 版本 >=7.0.0 >=4.2.9 Recommend ...

  8. gc问题mysql连接池_数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决...

    问题现象 在某个工作日,突然收到线上的服务告警,有大量的请求延时产生,查看线上服务发现基本上都是获取数据库连接超时,而且影响时间只有3~4秒钟,服务又恢复了正常.隔了几分钟之后,又出现了大量的告警,还 ...

  9. 怎样查看mysql连接池_如何实时查看mysql当前连接数?

    一.命令mysqladmin 1.查看当前所有连接的详细: mysqladmin -uroot -p -h127.0.0.1 processlist 2.只查看当前连接数(Threads就是连接数.) ...

最新文章

  1. bootsrap学习
  2. (zhuan) Recurrent Neural Network
  3. 阿里云双十一1折,1C2G 1年仅99 !!一起来拼团!
  4. mysql mysql_row 整行数据_PHP使用mysql_fetch_row查询获得数据行列表的方法,phpmysql_fetch_row_PHP教程...
  5. 《软件设计精要与模式》第二版源代码
  6. mongod备份还原常用命令
  7. 黑马程序员_网络编程总结
  8. 客户端是选择Java Swing还是C# Winform
  9. Java笔记(08):面向对象--抽象类
  10. 免费json客户端解析
  11. 360私有云平台Elasticsearch服务初探
  12. Memcached 学习---(5)set 命令
  13. 小tips:JS之浅拷贝与深拷贝
  14. LeetCode之罗马数字转整数
  15. 【Bug】下载steam游戏的E盘莫名其妙爆满
  16. 如何在手机浏览器中实现条形码/QR码扫描
  17. 打开lol一直连接服务器失败怎么回事,LOL英雄联盟连接失败无法连接服务器解决办法...
  18. airplay 协议开源资料整理
  19. 操作系统和各类编辑器的豆沙绿设置
  20. 【数理方程】傅里叶级数

热门文章

  1. Azure Services Platform
  2. mysql 函数怎样创建_mysql里怎样创建函数
  3. 信息学奥赛一本通(2072:【例2.15】歌手大奖赛)
  4. 信息学奥赛一本通(1066:满足条件的数累加)
  5. 吉哥系列故事――完美队形II(HDU-4513)
  6. 暑期训练日志----2018.8.10
  7. 图论 —— 稳定婚姻问题与延迟认可算法
  8. 统计字符数(信息学奥赛一本通-T1187)
  9. 一起学习C语言:C语言基本语法(一)
  10. 笨方法“学习python笔记之print换行