1. 程式人生 > >優化報表系統結構之報表server計算

優化報表系統結構之報表server計算

server -1 rop 簡潔 blog trac 對齊 tracking 報表系統

在報表項目中,經常會碰到數據庫壓力非常大影響整個系統性能的問題。由以下的傳統方案的結構示意圖能夠看出。所有數據存儲和源數據計算都放在數據庫完畢。當並發訪問量較大的時候,盡管每一個報表的數據量不大,還是會造成數據庫壓力過大。成為性能的瓶頸。多數數據庫廠商提供的jdbc接口數據傳輸比較緩慢。在並發量較大的情況,對報表系統性能的影響也非常明顯。

技術分享

這樣的情況時能夠考慮採用潤乾集算報表提供的本地計算方案。


所謂本地計算,是將一部分計算任務從數據庫中移出到報表server中完畢。

大多數有一定規模的應用系統中。數據庫和應用server一般會部署在不同的物理機器上。當中,數據庫處於中心地位,要為各個應用系統提供服務。假設運算大部分由數據庫完畢,則會導致數據庫壓力過大。而數據庫的擴容成本和難度都相當高。而應用server則不同,不同應用會有不同的應用server硬件,且easy集群擴容。

假設能將一部分運算移出數據庫。轉而由與應用server一起部署的報表server完畢,則會非常大程度地減小數據庫壓力,而且充分利用應用server所在機器的計算能力,提升系統性能。

集算報表方案結構示意圖例如以下:

技術分享

從上圖能夠看出,潤乾集算報表能夠將部分數據從數據庫轉移到報表應用server的本地硬盤。這部分數據能夠是計算的中間結果。也能夠是部分基礎數據。

集算報表內置了集算引擎。能夠通過簡潔的腳本進行本地化的數據計算。因此。從數據存儲和計算雙方面都能夠減少數據庫壓力。

部分數據和計算從數據庫轉移到報表應用server上,能夠充分利用應用server集群的存儲和計算能力。應用server不管是單機升級(縱向擴展)或者添加集群數量(橫向擴展)都要比數據庫server的成本低非常多。在本地硬盤上讀取數據的速度要比數據庫jdbc快非常多,能夠解決這個瓶頸問題。

集算引擎還能夠進行多線程的並行計算,能夠充分發揮應用server多cpu、多核的計算能力。因此。潤乾集算報表方案是低成本提高報表應用系統性能的優選方案。

以下,通過“某公司客戶累計銷售額與去年全年銷售額對照報表”的制作。來看一下集算報表是怎樣實現本地化計算的。報表例如以下圖:

技術分享

這張報表中的客戶、訂單數、銷售額都是直接從數據庫中計算的2010年1月-10月的數據。

2009年全年的訂單數、銷售額是從報表應用server文件系統中的temp2009sales.b文件裏讀取。“銷售額/去年銷售額”則是今年和去年的數據共同計算的。

報表上部的查詢button是集算報表提供的“參數模板”功能,詳細做法參見教程,這裏不再贅述。

首先,要提前用集算器從數據庫中讀取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定義的參數名稱,參數值是指報表提交給集算引擎的值。

這裏是將報表的兩個參數的值傳遞給集算器的同名參數。

第四,設計報表,例如以下圖:

技術分享

輸入參數計算後。就可以得到前面希望的報表。

優化報表系統結構之報表server計算