用集算器實(shí)現(xiàn)跨數(shù)據(jù)庫(kù)關(guān)聯(lián)報(bào)表
實(shí)際應(yīng)用中很多報(bào)表的數(shù)據(jù)來(lái)源于多個(gè)不同類型的數(shù)據(jù)庫(kù),報(bào)表數(shù)據(jù)源跨數(shù)據(jù)庫(kù)是報(bào)表開發(fā)中的常態(tài)。目前實(shí)現(xiàn)這類跨庫(kù)關(guān)聯(lián)報(bào)表的方式有多種,但都會(huì)存在這樣那樣的問(wèn)題。
使用報(bào)表工具自身多源關(guān)聯(lián)功能
現(xiàn)在大多數(shù)主流報(bào)表工具都支持多數(shù)據(jù)源關(guān)聯(lián),這在某些方面確實(shí)為報(bào)表用戶帶來(lái)了便利。然而我們也經(jīng)常會(huì)遇到通過(guò)報(bào)表自身的多源關(guān)聯(lián)功能很難實(shí)現(xiàn)一些跨庫(kù)關(guān)聯(lián)的報(bào)表(由于數(shù)據(jù)結(jié)構(gòu)和業(yè)務(wù)本身決定)。這當(dāng)然容易理解,報(bào)表工具主要是來(lái)做數(shù)據(jù)展現(xiàn)的,而對(duì)數(shù)據(jù)計(jì)算本身來(lái)說(shuō)并不擅長(zhǎng)。
即使有的能實(shí)現(xiàn),在報(bào)表中做跨庫(kù)關(guān)聯(lián)計(jì)算的效率也較低,遠(yuǎn)遠(yuǎn)不如數(shù)據(jù)庫(kù)的性能,而且經(jīng)常因?yàn)樵趯?shí)現(xiàn)過(guò)程中使用了大量隱藏行列進(jìn)一步降低報(bào)表性能并加大內(nèi)存占用。
于是一般會(huì)采用下面的兩種方式。
將數(shù)據(jù)統(tǒng)一到一個(gè)數(shù)據(jù)庫(kù)中
將不同數(shù)據(jù)庫(kù)的數(shù)據(jù)統(tǒng)一到一個(gè)數(shù)據(jù)庫(kù)中,這種做法在各類應(yīng)用中很常見,目的是使用數(shù)據(jù)庫(kù)(SQL)強(qiáng)大的計(jì)算能力。然而,這種做法會(huì)增加額外的成本開銷,將多個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù)統(tǒng)一到一個(gè)數(shù)據(jù)庫(kù)中勢(shì)必會(huì)占用昂貴的數(shù)據(jù)庫(kù)空間,并造成該數(shù)據(jù)庫(kù)數(shù)據(jù)過(guò)多、管理困難、壓力增大等問(wèn)題,而且還可能負(fù)擔(dān)額外的數(shù)據(jù)庫(kù)購(gòu)買成本以及管理成本。另外,完成ETL遷移數(shù)據(jù)也是一份不小的工作量,對(duì)實(shí)時(shí)性要求較高的報(bào)表還得用觸發(fā)器方式來(lái)做ETL(一般ETL是定時(shí)的),會(huì)嚴(yán)重影響原數(shù)據(jù)庫(kù)的性能。
使用高級(jí)語(yǔ)言實(shí)現(xiàn)跨庫(kù)關(guān)聯(lián)為報(bào)表準(zhǔn)備數(shù)據(jù)
基于上面提到兩種方式中存在的問(wèn)題,有些用戶使用高級(jí)語(yǔ)言(Java等)編程完成跨庫(kù)運(yùn)算,為報(bào)表自定義數(shù)據(jù)源。這種做法的優(yōu)點(diǎn)是靈活,理論上任何運(yùn)算通過(guò)程序都能完成;缺點(diǎn)是太難寫。很多像Java這樣的高級(jí)語(yǔ)言缺乏對(duì)集合運(yùn)算的有效支持,沒(méi)有相應(yīng)的類庫(kù),導(dǎo)致完成個(gè)簡(jiǎn)單的group也要寫很多(循環(huán))代碼,更不用說(shuō)關(guān)聯(lián)以后還要再進(jìn)行分組匯總等其他運(yùn)算了。
這種情況下,使用集算器來(lái)實(shí)現(xiàn)跨庫(kù)關(guān)聯(lián)報(bào)表就是個(gè)不錯(cuò)的選擇。
集算器如何實(shí)現(xiàn)跨庫(kù)關(guān)聯(lián)報(bào)表?
我們通過(guò)一個(gè)例子來(lái)看集算器是如何快速實(shí)現(xiàn)跨庫(kù)關(guān)聯(lián)報(bào)表的。
業(yè)務(wù)描述
企業(yè)員工每月應(yīng)發(fā)工資跟員工的基本工資、考勤以及績(jī)效有關(guān),考勤信息來(lái)源于人力部門的考勤系統(tǒng)(hsql數(shù)據(jù)庫(kù)),基本工資和績(jī)效信息則存儲(chǔ)在財(cái)務(wù)系統(tǒng)(mysql數(shù)據(jù)庫(kù))中。需要將這兩類信息合起來(lái)計(jì)算員工的工資。
實(shí)現(xiàn)步驟
編寫腳本(crossDB.dfx)完成跨庫(kù)關(guān)聯(lián)計(jì)算,為報(bào)表準(zhǔn)備數(shù)據(jù)
在A1、A2中通過(guò)connect分別連接hsql和mysql數(shù)據(jù)源
在A3、A4、A5中通過(guò)query語(yǔ)句分別從兩個(gè)數(shù)據(jù)庫(kù)中取出用到的數(shù)據(jù),此時(shí)數(shù)據(jù)已全部取出,不再需要與數(shù)據(jù)庫(kù)交互,在A6、A7中關(guān)閉兩個(gè)數(shù)據(jù)庫(kù)連接
在A8中使用join完成三表的連接
在A9中計(jì)算應(yīng)發(fā)工資,算法為:基本工資*(1-考勤系數(shù)+績(jī)效系數(shù))
最后通過(guò)A10的result生成供報(bào)表使用的結(jié)果集
報(bào)表調(diào)用集算器腳本完成報(bào)表展現(xiàn)
集算器的類包封裝成標(biāo)準(zhǔn)的JDBC,允許報(bào)表工具以類存儲(chǔ)過(guò)程的調(diào)用方式調(diào)用集算器腳本,如本例中在報(bào)表工具中像配置數(shù)據(jù)庫(kù)連接一樣配置起好集算器的JDBC,然后建立存儲(chǔ)過(guò)程數(shù)據(jù)集后使用 call crossDB()即可完成調(diào)用。
這里以BIRT為例說(shuō)明調(diào)用過(guò)程:
1、 復(fù)制集算器JDBC驅(qū)動(dòng)包到相應(yīng)目錄
2、 配置報(bào)表數(shù)據(jù)源
3、 設(shè)置DataSet,調(diào)用集算器腳本
簡(jiǎn)單幾步完成調(diào)用,BIRT即可使用集算器的計(jì)算結(jié)果直接展現(xiàn)輸出。
結(jié)語(yǔ)
通過(guò)這個(gè)例子可以看到,集算器擅長(zhǎng)完成跨庫(kù)計(jì)算,并將計(jì)算后的結(jié)果以標(biāo)準(zhǔn)ResultSet方式返回為報(bào)表提供數(shù)據(jù)源,而報(bào)表采用類存儲(chǔ)過(guò)程調(diào)用的方式調(diào)用集算器腳本非常簡(jiǎn)單。
還有一個(gè)重點(diǎn)需要關(guān)注,就是價(jià)格。集算器是個(gè)需要付費(fèi)的商業(yè)軟件,好在只針對(duì)大數(shù)據(jù)的集群才收費(fèi),用作報(bào)表數(shù)據(jù)源功能是免費(fèi)的,不需要增加成本就能輕松解決多數(shù)據(jù)庫(kù)關(guān)聯(lián)報(bào)表問(wèn)題。
posted on 2014-08-07 12:17 順其自然EVO 閱讀(813) 評(píng)論(0) 編輯 收藏 所屬分類: 測(cè)試學(xué)習(xí)專欄