qileilove

          blog已經(jīng)轉移至github,大家請訪問 http://qaseven.github.io/

          用集算器實現(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)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 昭通市| 奉贤区| 乌鲁木齐市| 湘西| 巴彦县| 融水| 孟津县| 革吉县| 和顺县| 邛崃市| 榆林市| 拉萨市| 密云县| 伊春市| 锦州市| 新蔡县| 固始县| 舒兰市| 和林格尔县| 清流县| 临江市| 五家渠市| 体育| 师宗县| 柳州市| 肃南| 上思县| 黄浦区| 永善县| 扎鲁特旗| 大姚县| 时尚| 嘉祥县| 天镇县| 鹤峰县| 丰台区| 满城县| 松溪县| 石泉县| 敖汉旗| 东港市|