線上應用程式升級,需要把缺失的數據關聯補充一下,你寫個程式處理一下? 客戶信息同步,由於是線上敏感欄位都是加密處理,所以需要你再寫個程式解密處理一下? 曾記得 N 年前,我經常幹這種事情,碼這種代碼。今天回過頭來,對此類事情簡單做一個分享,以防你們也遇到此類問題,不妨拿去實踐一下,說不定會提高效率呢 ...
線上應用程式升級,需要把缺失的數據關聯補充一下,你寫個程式處理一下?
客戶信息同步,由於是線上敏感欄位都是加密處理,所以需要你再寫個程式解密處理一下?
曾記得 N 年前,我經常幹這種事情,碼這種代碼。今天回過頭來,對此類事情簡單做一個分享,以防你們也遇到此類問題,不妨拿去實踐一下,說不定會提高效率呢。
01. 說思路
其實上圖已經把問題解決思路,簡單明瞭化了,還是再重覆解釋一下。
首先要寫一個 Java Main 函數, 接收應用執行所需的參數,例如:資料庫連接 URL、用戶名、密碼;待更新數據的時間等等。
然後需要提供一個觸發 shell 腳本,術業有專攻,考慮到運維同事線上上操作的方便,一鍵便可運行。
思路清晰之後,其實寫數據處理的程式一點都不難。
數據處理程式最基本、最簡單的寫法可以用 JDBC;略顯牛掰的可以用 MyBatis,程式寫完部署到線上時只需要編譯後的 class 文件;另外程式需要引入資料庫相關類庫(jar 包)以及用到的三方類庫;偶爾會接到結合源數據 srcData 來處理線上數據的需求場景。
所以線上發佈的 package 大致如下:
classes 用於存放編譯之後的數據處理程式 lib 用於存放資料庫相關jar包以及三方類庫等 notifyDataUpdate.sh 用於觸發數據處理程式的腳本 srcData.txt 源數據(偶爾會解析源數據入庫更新等操作)
02. 講實現
上面已經說過,寫數據處理的程式一點都不難,這個小兒科的東西,也不是咱們今天分享的重點(不懂的,問一問度娘,度娘會告訴你一大堆)。
接下來咱們還是重點聊一聊,如何編寫觸發數據處理程式的 shell 腳本吧,一言不合,直接拋代碼。
#!/usr/bin/ksh LANG=zh_CN export LANG echo "----------" `date` "--------" cd /usr/app/p2pDataUpdate # do business APP_BASE=/usr/app/p2pDataUpdate LIB_BASE=$APP_BASE/lib CLASSPATH=./:./classes CLASSPATH=$CLASSPATH:$LIB_BASE/db2jcc_license_cu.jar CLASSPATH=$CLASSPATH:$LIB_BASE/db2jcc.jar export CLASSPATH java P2PDataUpdate jdbc:db2://localhost:50000/dev username userpwd /usr/app/p2pDataUpdate
仔細看的你們,應該發現很簡單,就是進入應用目錄,然後配置 CLASSPATH,最後運行 java Main 再加上參數。
這樣運維同事線上上操作時,就無需關註數據處理 Java 程式這些東東啦,直接運行 shell 腳本就 ok 了,術業有專攻,那麼運維遇到 shell 腳本,應該是最親熱不過了。
03. 寫最後
分享了個簡單的數據處理工具,如果我們再配上一個 crontab 定時調度 shell 腳本,那麼就可以解決業務數據定期同步的場景啦(這個場景用的也比較多)。
為了讓你們輕鬆玩轉上面這款工具,最後再分享一些經驗(躺過的坑)吧。
經驗一:shell腳本中的空格如何去除?
sed -i 's/\r$//' XXXX.sh
經驗二:shell 腳本中如何傳入當前的日期?
LD=`perl -MPOSIX -le 'print strftime "%Y-%m-%d", localtime(time()-86400);'` echo LD=${LD} java P2PDataUpdate jdbc:db2://localhost:50000/dev username userpwd ${LD}
經驗三:如何修改 Linux 的時區?
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
經驗四:如果數據創建時間 intime 欄位有索引,註意下麵的拼接才會走索引呦
intime>='2012-04-01-00.00.00.000000' and intime<='2012-04-30-23.59.59.999999'
希望今天的簡單分享,能幫助你們提高工作的效率,騰出更多時間去喝咖啡。