在報表項目中,常常會碰到數據庫壓力很大影響整個系統性能的問題。由下面的傳統方案的結構示意圖可以看出,全部數據存儲和源數據計算都放在數據庫完成。當並發訪問量較大的時候,雖然每個報表的數據量不大,還是會造成數據庫壓力過大,成為性能的瓶頸。多數數據庫廠商提供的jdbc接口傳輸數據比較緩慢,在並發量較大的情況,對報表系統性能的影響也非常明顯。
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICAg1eLW1sfpv/bKsb/J0tS/vMLHssnTw8jzx6y8r8vjsaix7czhuam1xLG+tdi8xsvjt72wuKGjPC9wPgoKICAgICAgICDL+c69sb612LzGy+OjrMrHvavSu7K/t9a8xsvjyM7O8bTTyv2+3b/i1tDSxrP2tb2xqLHtt/7O8cb31tDN6rPJoaO087bgyv3T0NK7tqi55sSjtcTTptPDz7XNs9bQo6zK/b7dv+K6zdOm08O3/s7xxvfNqLOju+Gyv8rw1Nqyu82stcTO78Dtu/rG98nPoaPG5NbQo6zK/b7dv+K0ptPa1tDQxLXYzrujrNKqzqq497j206bTw8+1zbPM4bmpt/7O8aGjyOe5+9TLy+O087K/t9bTycr9vt2/4s3qs8mjrNTyu+G1vNbCyv2+3b/i0bnBprn9tPOjrLb4yv2+3b/itcTAqcjds8mxvrrNxNG2yLa8z+C1sbjfoaO2+NOm08O3/s7xxvfU8rK7zayjrLK7zazTptPDu+HT0LK7zay1xNOm08O3/s7xxvfTsrz+o6zH0sjd0te8r8i6wKnI3aGjyOe5+8TcvavSu7K/t9bUy8vj0saz9sr9vt2/4qOs16q2+NPJ0+vTptPDt/7O8cb30rvG8LK/yvC1xLGose23/s7xxvfN6rPJo6zU8rvhuty087PMtsi12Lz10KHK/b7dv+LRucGmo6yyosfSs+S31sD708PTptPDt/7O8cb3y/nU2rv6xve1xLzGy+PE3MGmo6zM4cn9z7XNs9DUxNyho7yvy+OxqLHtt72wuL3hubnKvtLizbzI58/Co7o8YnI+Cgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20150610/2015061010111231.jpg" alt="\">
從上圖可以看出,潤乾集算報表可以將部分數據從數據庫轉移到報表應用服務器的本地硬盤。這部分數據可以是計算的中間結果,也可以是部分基礎數據。集算報表內置了集算引擎,可以通過簡潔的腳本進行本地化的數據計算。因此,從數據存儲和計算兩方面都可以降低數據庫壓力。
部分數據和計算從數據庫轉移到報表應用服務器上,可以充分利用應用服務器集群的存儲和計算能力。應用服務器無論是單機升級(縱向擴展)或者增加集群數量(橫向擴展)都要比數據庫服務器的成本低很多。在本地硬盤上讀取數據的速度要比數據庫jdbc快很多,可以解決這個瓶頸問題。集算引擎還可以進行多線程的並行計算,可以充分發揮應用服務器多cpu、多核的計算能力。因此,潤乾集算報表方案是低成本提高報表應用系統性能的優選方案。
下面,通過“某公司客戶累計銷售額與去年全年銷售額對比報表”的制作,來看一下集算報表是如何實現本地化計算的。報表如下圖:
這張報表中的客戶、訂單數、銷售額都是直接從數據庫中計算的2010年1月-10月的數據。2009年全年的訂單數、銷售額是從報表應用服務器文件系統中的temp2009sales.b文件中讀取。“銷售額/去年銷售額”則是今年和去年的數據共同計算的。報表上部的查詢按鈕是集算報表提供的“參數模板”功能,具體做法參見教程,這裡不再贅述。
首先,要提前用集算器從數據庫中讀取2009年等各個年份的銷售數據,計算好之後,以集算器的二進制編碼導出到temp2009sales.b文件中,每年一個文件。中間數據制作好之後,數據庫中2009年的數據就可以移除備份了,不再占用數據庫的空間。
第二,編寫集算器腳本salesProportion.dfx如下:
注意,腳本的參數是:argyear(要查詢的年份),argmonth(要查詢的月份)。
A1:連接預先配置好的數據源demo。
A2:從數據庫中計算取出要查詢的年份訂單數、銷售額。
A3:從前一年的數據文件中取出數據。
A4:將A3中的數據按照A2中的CLIENT字段對齊,A2中有A3中沒有的補空行。
A5:利用A2來生成新的續表。其中增加了A4的對應行數據,比如A4(#).C:lastCOUNT就是A4的對應行(#是A2的當前行號)中取出C字段。
A6:關閉數據庫連接。
A7:向報表返回結果集。
第三,在集算報表中定義報表參數(argyear、argmonth)和計算數據集:
上圖中,參數名是指dfx定義的參數名稱,參數值是指報表提交給集算引擎的值。這裡是將報表的兩個參數的值傳遞給集算器的同名參數。
第四,設計報表,如下圖:
輸入參數計算後,即可得到前面希望的報表。