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