Java數(shù)據(jù)開發(fā)輔助工具Docker與普通程序使用方法
介紹
需求背景
有很多業(yè)務(wù)系統(tǒng),他們的數(shù)據(jù)庫是相互獨(dú)立的,俗稱數(shù)據(jù)孤島,為了做數(shù)據(jù)統(tǒng)計(jì)分析,就需要把這些數(shù)據(jù)歸集在一個(gè)數(shù)據(jù)庫中,比如數(shù)據(jù)倉庫,然后多表關(guān)聯(lián)查詢,方便開發(fā)數(shù)據(jù)應(yīng)用。希望能有這樣的工具,指定兩個(gè)數(shù)據(jù)庫和表名,就可以將表從源數(shù)據(jù)庫拷貝到目標(biāo)數(shù)據(jù)庫中。具體需求如下:
- 能自動(dòng)同步表結(jié)構(gòu),如:源表加字段,目標(biāo)表自動(dòng)加字段。
- 支持增量或全量復(fù)制數(shù)據(jù),比如按日期進(jìn)行復(fù)制數(shù)據(jù)。
- 支持指定字段同步,只同步關(guān)心的那些字段。
- 支持主流的關(guān)系型數(shù)據(jù)庫: mysql、db2、postgresql、oracle、sqlserver
- 源表和目標(biāo)表表名可以不同,字段名也可以不同(已存在目標(biāo)表的情況下)
因?yàn)樽约阂茫揖妥约簩懥艘粋€(gè),順便熟悉下 java 開發(fā)(之前一直用 Python,不得不說,Java 真浪費(fèi)時(shí)間),本程序的最大用處就是構(gòu)建集市或數(shù)倉所需要的基礎(chǔ)層數(shù)據(jù)源,歡迎感興趣的朋友一起加入。
程序的使用方法
Docker 方式
這里用到三個(gè)容器:
- app 也就是主程序本身,app 容器使用的程序文件就是 release 目錄下的文件,已經(jīng)做了綁定。
- mysql 測試用的,作為源數(shù)據(jù)庫,已提前放好了有 7000 條測試數(shù)據(jù)的表 somenzz_users。
- postgres 測試用的,作為目標(biāo)數(shù)據(jù)庫,沒有數(shù)據(jù)。
先部署,執(zhí)行 docker-compose up -d
就會(huì)自動(dòng)完成應(yīng)用和數(shù)據(jù)庫的部署:
$ 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
這樣三個(gè)容器就啟動(dòng)了,使用 docker ps -a |grep database-sync
可以查看到三個(gè)正在運(yùn)行的容器:
現(xiàn)在直接使用 docker exec -i database-sync_app_1 java -jar database-sync-1.3.jar
來執(zhí)行程序:
mysql 容器已有測試數(shù)據(jù),release/config/config.json
已經(jīng)配置好了數(shù)據(jù)庫的連接,因此可以直接試用,以下演示的是從 mysql 復(fù)制表和數(shù)據(jù)到 postgres:
1. 全量復(fù)制,自動(dòng)建表:
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
,可以進(jìn)入容器內(nèi)部執(zhí)行:
(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. 增量復(fù)制:
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'"
普通方式
程序運(yùn)行前確保已安裝 java 1.8 或后續(xù)版本,已經(jīng)安裝 maven,然后 clone 源碼,打包:
git clone https://gitee.com/somenzz/database-sync.git cd database-sync mvn package
此時(shí)你會(huì)看到 target 目錄,將 target 下的 lib 目錄 和 database-sync-1.3.jar 復(fù)制出來,放在同一目錄下,然后再創(chuàng)建一個(gè) config 目錄,在 config 下新建一個(gè) config.json 文件寫入配置信息,然后將這個(gè)目錄壓縮,就可以傳到服務(wù)器運(yùn)行了,請注意先充分測試,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,運(yùn)行方式是這樣的:
(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
幫助說明:
[] 中括號(hào)里的內(nèi)容表示選填,例如 [options] 表示 options 下的參數(shù)不是必須的。
1、其中 options 參數(shù)解釋如下:
--sync-ddl
或者 -sd
: 加入該參數(shù)會(huì)自動(dòng)同步表結(jié)構(gòu)。
--from_fields=col1,col2
或者 -ff=col1,col2
: 指定原表的字段序列,注意 = 前后不能有空格。
--to_fields=col3,col4
或者 -tf=col3,col4
: 指定目標(biāo)表的字段序列,注意 = 前后不能有空格。
2、whereClause 表示 where 條件,用于增量更新,程序再插入數(shù)據(jù)前先按照 where 條件進(jìn)行清理數(shù)據(jù),然后按照 where 條件從原表進(jìn)行讀取數(shù)據(jù)。whereClause 最好使用雙引號(hào)包起來,表示一個(gè)完整的參數(shù)。如:"jyrq='2020-12-31'"
{} 大括號(hào)里的內(nèi)容表示必填。
fromDb
是指配置在 config.json 的數(shù)據(jù)庫信息的鍵,假如有以下配置文件:
{ "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
讀取數(shù)據(jù)的表的模式名,可以填寫 "".
fromTable
讀取數(shù)據(jù)的表明,必須提供。
toSchema
寫入數(shù)據(jù)表的模式名,可以填寫 "",可以和 fromSchema 不同.
toTable
寫入數(shù)據(jù)表的表名,必須提供,當(dāng)寫入表不存在時(shí),自動(dòng)按讀取表的表結(jié)構(gòu)創(chuàng)建,可以和 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
表示數(shù)據(jù)庫類型,均為小寫:
- mysql
- postgres
- db2
- oracle
- sqlserver
tbspace_ddl
表示自動(dòng)建表時(shí)指定的表空間,該選項(xiàng)不是必需的,可以刪除。
buffer-rows
表示讀取多少行時(shí)一塊寫入目標(biāo)數(shù)據(jù)庫,根據(jù)服務(wù)器內(nèi)存大小自己做調(diào)整,100000 行提交一次滿足大多數(shù)情況了。
encoding
用于表結(jié)構(gòu)同步時(shí)確定字段長度,比如說源庫的字段是 gbk varchar(10),目標(biāo)庫是 utf-8,那么就應(yīng)該為 varchar(15),這樣字段有中文就不會(huì)出現(xiàn)截?cái)嗷虿迦胧栴},程序這里 2 倍,也就是 varchar(20) ,這樣字段長度不會(huì)出現(xiàn)小數(shù)位。
最后的話
提高數(shù)據(jù)庫間表的復(fù)制效率,如果不需要對源表字段進(jìn)行轉(zhuǎn)換,就丟掉低效的 datastage 和 kettle 吧。
以上就是Java數(shù)據(jù)開發(fā)輔助工具Docker與普通程序使用方法的詳細(xì)內(nèi)容,更多關(guān)于Java數(shù)據(jù)開發(fā)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java基于正則表達(dá)式獲取指定HTML標(biāo)簽指定屬性值的方法
這篇文章主要介紹了Java基于正則表達(dá)式獲取指定HTML標(biāo)簽指定屬性值的方法,涉及java基于正則的HTML元素匹配相關(guān)操作技巧,需要的朋友可以參考下2017-01-01Spring boot隨機(jī)端口你都不會(huì)還怎么動(dòng)態(tài)擴(kuò)容
這篇文章主要介紹了Spring boot隨機(jī)端口你都不會(huì)還怎么動(dòng)態(tài)擴(kuò)容,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05mybatis中映射文件(mapper)中的使用規(guī)則
這篇文章主要介紹了mybatis中映射文件(mapper)中的使用規(guī)則,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11JavaWeb實(shí)現(xiàn)簡單用戶發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)簡單用戶發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Gradle構(gòu)建多模塊項(xiàng)目的方法步驟
這篇文章主要介紹了Gradle構(gòu)建多模塊項(xiàng)目的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05詳解使用MyBatis Generator自動(dòng)創(chuàng)建代碼
這篇文章主要介紹了使用MyBatis Generator自動(dòng)創(chuàng)建代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12