Java数据开发辅助工具Docker与普通程序使用方法

目录
  • 介绍
    • 需求背景:
  • 程序的使用方法
    • 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数据开发的资料请关注我们其它相关文章!

时间: 2021-09-14

在Docker中开发Java 8 Spring Boot应用程序的方法

在本文中,我将向您展示如何使用Java 8开发和运行简单的Spring Web应用程序,而无需在本地计算机上安装Java 8. Python开发人员使用虚拟环境为不同项目创建和管理单独的环境,每个环境使用不同版本的Python来执行,存储和解析Python依赖项.Java和许多其他技术不支持虚拟环境概念.在这一点上,Docker来帮助我们. Docker是一个虚拟化平台.您可以从Docker官方网站上找到基本信息和安装指南. 一旦安装了Docker工具箱,就不需要安装我们的示例应用程序中所需的J

使用Docker搭建Java环境的步骤方法

Docker是干什么的 Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发,源代码托管在 Github 上, 遵从Apache2.0协议开源.Docker的目标是实现轻量级的操作系统虚拟化解决方案. 学习Docker首先要了解几个概念: 镜像-Docker的镜像和常见的系统ISO镜像类似,包含了应用程序的信息: 容器-容器相当于一个可以运行起来的虚拟机,应用程序运行在容器中,Docker运行在"Docker"上: 仓库-仓库

利用 Docker 构建简单的 java 开发编译环境的方法详解

目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境,折腾起来还是需要花费一些时间的,并且日后在不同版本间切换每次都要折腾一次. Docker 的出现让我们维护不同版本的开发编译环境变得简单,如果你还不知道什么是 Docker 可以看看 Docker 入门介绍.我们可以采用两种方式来构建 java 的开发环境,一种是在容器内编译运行,一种是在容器外编

docker启动Java程序的方法步骤

创建一个简单的Spring boot web项目 idea工具创建Spring boot web项目,因为是测试,一直next就行. 写一个test API,用来访问,服务端口号可以不用改,我本地改成8701. 程序启动,发现程序不是默认的8080端口了,访问:http://localhost:8701/v1/hello 以上一个简单web项目建好了,下面我们通过docker来运行这个demo项目 第一步,你需要安装docker(这里不做详细步骤). 第二步,我们需要一个有java环境docke

php调用自己java程序的方法详解

本文实例讲述了php调用自己的java程序实现方法.分享给大家供大家参考,具体如下: 最开始要装jdk这个就不用说了,我装的是java ee 5+jdk 1.把下载的php-java-bridge_5.2.2_j2ee.zip解压出来,里面有个JavaBridge.war 直接用winrar打开,到WEB-INF/lib/JavaBridge.jar 把这个jar包拷到 你的php目录的ext/下. 2.打开war包,里面有个java的文件夹,把他全部拷到你的PHP项目下,如/demo/java

基于docker搭建nginx文件服务器的方法步骤

1.在本机新建配置文件docker_nginx.conf server { listen 7070; server_name localhost; charset utf-8; location /files { #在docker内nginx的目录 alias /home/files; expires 1d; allow all; autoindex on; } 2.启动命令 docker run --name nginx -d -p 7070:7070 -v D:\dev\nginx-1.13

Android 启动第三方程序的方法总结

Android 启动第三方程序的方法总结 方法一: Intent intent = new Intent(); intent.setClassName(<package name>, <class name>); startActivity(intent); 方法二: Intent i=new Intent; ComponentName com= new ComponentName(<Package Name> , <Calss Name>); i.setC

JavaScript调用客户端Java程序的方法

本文实例讲述了JavaScript调用客户端Java程序的方法.分享给大家供大家参考.具体如下: 一般说来,JavaScript是没有权限调用客户端可执行程序的.但有时有些特殊需要,又不得不调用.例如有时涉及客户端文件的操作此时,当然我们可以用 FileSystemObject对象来完成.又例如我们前些时做的项目中,需求是点击页面一个链接不弹出IE的那个文件下载的对话框 (有三个选项:打开.保存.取消的那个),直接把文件下载到指定目录 .此时就不得不绕过浏览器的这个对话框,自己写一个客户端的ja

Linux下执行java程序的方法

想要在Ubuntu上运行java程序,可以将java程序编译成功后打包,然后在Ubuntu上用命令执行jar文件 具体操作如下: 1.Windows上使用eclipse编译java工程,编译完成后导出为Runnable JAR File 例如,此处将test工程中的Test2文件export为MyTest2.jar文件 2.Ubuntu上java环境安装 ①jdk官网http://www.oracle.com/technetwork/java/javase/downloads/jdk8-down

docker快速安装rabbitmq的方法步骤

一.获取镜像 #指定版本,该版本包含了web控制页面 docker pull rabbitmq:management 二.运行镜像 #方式一:默认guest 用户,密码也是 guest docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management #方式二:设置用户名和密码 docker run -d --hostname my-rabbit --name rabb

自定义vbs脚本实现开机后延时启动指定程序的方法

概述 系统开机时,顺带自动启动了不少驱动程序,使得电脑开机后鼠标要呆滞许久.为了加快windows的开机速度,在参考网上不少大牛的资料后,整理出使用vbs脚本实现开机后延时启动程序的方法 vbs内容示例: 复制代码 代码如下: Dim delayer Set delayer = CreateObject("WScript.Shell") WScript.sleep 8000 delayer.Run """C:\Program Files(x86)\King

PowerShell中以管理员权限启动应用程序的方法

又一个PowerShell比CMD好的地方.在CMD中用管理员权限来启动应用程序很复杂,但在PowerShell中就简单多了,如下: 复制代码 代码如下: Start-Process notepad -Verb runas Start-Process "$PSHOME\powershell.exe" -Verb runas

一个小时快速搭建微信小程序的方法步骤

「小程序」这个划时代的产品发布快一周了,互联网技术人都在摩拳擦掌,跃跃欲试.可是小程序目前还在内测,首批只发放了 200 个内测资格(泪流满面).本以为没有 AppID 这个月就与小程序无缘了,庆幸的是微信这两天发布了正式版开发者工具,无需内测邀请也可以尝鲜了. 因此也就有了我与「小程序」的初体验,而我的感受只有一个字--爽! 选择哪个「小程序」Demo? 在知名同性交友网站 Github 上,「小程序」的 Demo 不少,但是大多只是简单的 API 演示,有的甚至直接把页面数据写在了 json