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