Java数据开发辅助工具Docker与普通程序使用方法
介绍
需求背景
有很多业务系统,他们的数据库是相互独立的,俗称数据孤岛,为了做数据统计分析,就需要把这些数据归集在一个数据库中,比如数据仓库,然后多表关联查询,方便开发数据应用。希望能有这样的工具,指定两个数据库和表名,就可以将表从源数据库拷贝到目标数据库中。具体需求如下:
- 能自动同步表结构,如:源表加字段,目标表自动加字段。
- 支持增量或全量复制数据,比如按日期进行复制数据。
- 支持指定字段同步,只同步关心的那些字段。
- 支持主流的关系型数据库: mysql、db2、postgresql、oracle、sqlserver
- 源表和目标表表名可以不同,字段名也可以不同(已存在目标表的情况下)
因为自己要用,我就自己写了一个,顺便熟悉下 java 开发(之前一直用 Python,不得不说,Java 真浪费时间),本程序的最大用处就是构建集市或数仓所需要的基础层数据源,欢迎感兴趣的朋友一起加入。
程序的使用方法
Docker 方式
这里用到三个容器:
- app 也就是主程序本身,app 容器使用的程序文件就是 release 目录下的文件,已经做了绑定。
- mysql 测试用的,作为源数据库,已提前放好了有 7000 条测试数据的表 somenzz_users。
- postgres 测试用的,作为目标数据库,没有数据。
先部署,执行 docker-compose up -d
就会自动完成应用和数据库的部署:
$ git clone https://github.com/somenzz/database-sync.git $ cd database-sync $ docker-compose up -d Creating database-sync_postgres_1 ... done Creating database-sync_app_1 ... done Creating database-sync_mysql_1 ... done
这样三个容器就启动了,使用 docker ps -a |grep database-sync
可以查看到三个正在运行的容器:
现在直接使用 docker exec -i database-sync_app_1 java -jar database-sync-1.3.jar
来执行程序:
mysql 容器已有测试数据,release/config/config.json
已经配置好了数据库的连接,因此可以直接试用,以下演示的是从 mysql 复制表和数据到 postgres:
1. 全量复制,自动建表:
docker exec -i database-sync_app_1 java -jar database-sync-1.3.jar mysql_test testdb somenzz_users postgres_test public users --sync-ddl
如果你不想每次都敲 docker exec -i database-sync_app_1
,可以进入容器内部执行:
(py38env) ➜ database-sync git:(master) ✗ docker exec -it database-sync_app_1 /bin/bash root@063b1dc76fe1:/app# ls config database-sync-1.3.jar lib logs root@063b1dc76fe1:/app# java -jar database-sync-1.3.jar mysql_test testdb somenzz_users postgres_test public users -sd
2. 增量复制:
root@063b1dc76fe1:/app# java -jar database-sync-1.3.jar mysql_test testdb somenzz_users postgres_test public zz_users "create_at >= '2018-01-09'"
3. 指定字段:
root@063b1dc76fe1:/app# java -jar database-sync-1.3.jar mysql_test testdb somenzz_users postgres_test public zz_users -ff="user_id,name,age" -tf="user_id,name,age" "create_at >= '2018-01-09'"
普通方式
程序运行前确保已安装 java 1.8 或后续版本,已经安装 maven,然后 clone 源码,打包:
git clone https://gitee.com/somenzz/database-sync.git cd database-sync mvn package
此时你会看到 target 目录,将 target 下的 lib 目录 和 database-sync-1.3.jar 复制出来,放在同一目录下,然后再创建一个 config 目录,在 config 下新建一个 config.json 文件写入配置信息,然后将这个目录压缩,就可以传到服务器运行了,请注意先充分测试,jdk 要求 1.8+
[aaron@hdp002 /home/aaron/App/Java/database-sync]$ ls -ltr total 48 drwxr-xr-x 2 aaron aaron 4096 Apr 23 2020 lib -rwxrw-r-- 1 aaron aaron 157 Jun 23 2020 run.sh drwxrwxr-x 2 aaron aaron 4096 Jul 3 2020 logs -rw-rw-r-- 1 aaron aaron 24773 Mar 16 2021 database-sync-1.3.jar drwxr-xr-x 7 aaron aaron 4096 Aug 3 2020 jdk1.8.0_231 drwxrwxr-x 2 aaron aaron 4096 Feb 19 17:07 config
你也可以直接下载我打包好的使用。
程序名称叫 database-sync,运行方式是这样的:
(py38env) ➜ target git:(master) ✗ java -jar database-sync-1.3.jar -h Usage: java -jar database-sync-1.0.jar [options] {fromDB} {fromSchema} {fromTable} {toDB} {toSchema} {toTable} [whereClause] options: -v or --version :print version then exit -h or --help :print help info then exit -sd or --sync-ddl :auto synchronize table structure -ff=col1,col2 or --from-fields=col1,col2 :specify from fields -tf=col3,col4 or --to-fields=col3,col4 :specify to fields --no-feature or -nf :will not use database's feature
帮助说明:
[] 中括号里的内容表示选填,例如 [options] 表示 options 下的参数不是必须的。
1、其中 options 参数解释如下:
--sync-ddl
或者 -sd
: 加入该参数会自动同步表结构。
--from_fields=col1,col2
或者 -ff=col1,col2
: 指定原表的字段序列,注意 = 前后不能有空格。
--to_fields=col3,col4
或者 -tf=col3,col4
: 指定目标表的字段序列,注意 = 前后不能有空格。
2、whereClause 表示 where 条件,用于增量更新,程序再插入数据前先按照 where 条件进行清理数据,然后按照 where 条件从原表进行读取数据。whereClause 最好使用双引号包起来,表示一个完整的参数。如:"jyrq='2020-12-31'"
{} 大括号里的内容表示必填。
fromDb
是指配置在 config.json 的数据库信息的键,假如有以下配置文件:
{ "postgres":{ "type":"postgres", "driver":"org.postgresql.Driver", "url":"jdbc:postgresql://localhost:5432/apidb", "user": "postgres", "password":"aaron", "encoding": "utf-8" }, "aarondb":{ "type":"mysql", "driver":"com.mysql.cj.jdbc.Driver", "url":"jdbc:mysql://localhost:3306/aarondb?useSSL=false&characterEncoding=utf8&serverTimezone=UTC", "user": "aaron", "password":"aaron" } }
fromDb、toDb 可以是 aarondb 或者 postgres。
fromSchema
读取数据的表的模式名,可以填写 "".
fromTable
读取数据的表明,必须提供。
toSchema
写入数据表的模式名,可以填写 "",可以和 fromSchema 不同.
toTable
写入数据表的表名,必须提供,当写入表不存在时,自动按读取表的表结构创建,可以和 fromTable 不同。
全量、增量、指定字段的使用样例请参考 Docker 方式。
配置文件说明
配置文件位于 config/config.json,如下所示:
{ "sjwb":{ "type":"db2", "driver":"com.ibm.db2.jcc.DB2Driver", "url":"jdbc:db2://192.168.1.*:50000/wbsj", "user": "****", "password":"****", "tbspace_ddl": "/*这里可以放置指定表空间的语句*/", "encoding":"utf-8" }, "dw_test":{ "type":"db2", "driver":"com.ibm.db2.jcc.DB2Driver", "url":"jdbc:db2://192.168.169.*:60990/dwdb", "user": "****", "password":"****", "encoding":"gbk" }, "postgres":{ "type":"postgres", "driver":"org.postgresql.Driver", "url":"jdbc:postgresql://10.99.**.**:5432/apidb", "user": "****", "password":"****", "tbspace_ddl": "WITH (compression=no, orientation=orc, version=0.12)\ntablespace hdfs\n", "encoding":"utf-8" }, "aarondb":{ "type":"mysql", "driver":"com.mysql.cj.jdbc.Driver", "url":"jdbc:mysql://localhost:3306/aarondb?useSSL=false&characterEncoding=utf8&serverTimezone=UTC", "user": "****", "password":"****", "encoding":"utf-8" }, "buffer-rows": 100000 }
配置文件说明:
type
表示数据库类型,均为小写:
- mysql
- postgres
- db2
- oracle
- sqlserver
tbspace_ddl
表示自动建表时指定的表空间,该选项不是必需的,可以删除。
buffer-rows
表示读取多少行时一块写入目标数据库,根据服务器内存大小自己做调整,100000 行提交一次满足大多数情况了。
encoding
用于表结构同步时确定字段长度,比如说源库的字段是 gbk varchar(10),目标库是 utf-8,那么就应该为 varchar(15),这样字段有中文就不会出现截断或插入失败问题,程序这里 2 倍,也就是 varchar(20) ,这样字段长度不会出现小数位。
最后的话
提高数据库间表的复制效率,如果不需要对源表字段进行转换,就丢掉低效的 datastage 和 kettle 吧。
以上就是Java数据开发辅助工具Docker与普通程序使用方法的详细内容,更多关于Java数据开发的资料请关注猪先飞其它相关文章!
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
docker 启动elasticsearch镜像,挂载目录后报错的解决
这篇文章主要介绍了docker 启动 elasticsearch镜像,挂载目录后报错的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-20- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20Java中lombok的@Builder注解的解析与简单使用详解
这篇文章主要介绍了Java中lombok的@Builder注解的解析与简单使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-06- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
- 这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16