纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

somenzz   2021-09-14 我要评论
想了解Java数据开发辅助工具Docker与普通程序使用方法的相关内容吗somenzz在本文为您仔细讲解Java数据开发Docker与普通程序的相关知识和一些Code实例欢迎阅读和指正我们先划重点: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 吧


相关文章

猜您喜欢

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式