報表資料的可控快取

xiaohuihui發表於2019-12-10

使用快取可以提升報表效能是一個共識,一般高階報表工具都會提供報表快取功能,將整個報表計算結果快取在檔案系統中,以便使用者下次訪問引數相同的報表時可以快速讀取快取結果進行展現。潤乾報表作為報表工具的領軍品牌,當然也具有這種常規的快取功能。

但在有些情況下,報表開發人員還希望進一步控制快取的內容,比如對於快取內容,可能只想快取一部分而不是整個報表結果,或者能夠讓其它報表或程式複用快取內容,又比如對於超時設定,可能希望為不同的快取結果設定不同的超時時間。這些需求都來自於實際業務中需要應對的資料量和實時性方面的不同情況,也是一般報表工具的快取功能無法滿足的。

潤乾報表內建了可程式設計的資料計算引擎(結合集算器實現),允許開發人員靈活控制快取內容,稱為可控快取。可控快取能夠帶來更大的靈活性,下面就前面提到的三點展開介紹。

1、快取部分結果

在報表開發中,有時並不希望將所有報表結果進行快取,避免耗費過高的快取成本(磁碟空間和應用伺服器資源開銷)。另外,當報表中的部分資料實時性要求很高,需要實時與資料庫互動進行資料查詢,那麼就並不適合進行快取。這種情況下,透過潤乾報表的可控快取可以將變化不太頻繁的中間結果快取起來。當報表再次請求時,實時性要求高的資料仍然從資料庫中讀取,同時結合快取中的非實時資料進行報表計算,得到最終報表結果集。常規快取方案中沒有這種快取部分結果的功能,只能設定整個報表是否進行快取,這樣報表在涉及資料的不同時效性時就必須平衡兩者的矛盾,而潤乾報表在這方面顯然更加靈活,效率更高。

2、快取結果複用

潤乾報表中可控快取是可以複用的,一個報表的快取結果(部分或全部)可以被其他報表或程式讀取並使用,而不必像常規報表快取方案那樣重複快取同樣的結果,這顯然也會大幅度提高快取的整體效率。當其他報表或程式使用某個報表的快取結果時,只需從快取(一般是磁碟檔案)中讀取,並與報表中其他資料來源(可能是 DB、檔案,或是另一個報表的快取)進行混合運算,就能得到報表需要的結果集,處理方式和快取部分結果的方式類似。常規的報表快取以報表模板為單位進行快取,彼此無法複用,會造成相當的資源浪費,增加不小的效能開銷,而潤乾報表在這方面同樣體現了靈活和高效。

3、設定不同超時時間

快取機制中一定會有超時時間,過時的快取會被清除,報表再訪問時再重新快取。一般報表工具的快取超時時間在配置檔案中設定,如通常的 3600s 或 7200s,這種設定往往作用於對單張報表的所有引數,有時甚至作用於所有報表。換句話說,整個報表甚至整個系統都必須使用同樣的設定。

這種做法顯然效能不高,如果能夠針對不同的報表場景設定不同的超時時間,自然會更有效。比如,針對大量歷史資料進行查詢的報表,由於歷史資料一般很少變化,我們希望報表的快取結果可以儲存較長時間,相應地設定較長的超時時間;而針對資料變化頻繁,實時性要求較高的報表則設定較短的超時時間,以便滿足資料的實時性要求。

潤乾報表的結果快取允許開發人員針對不同的報表設定不同的超時時間,以應對不同的報表場景。這種做法同樣提供了更高的靈活性,使得報表快取成為真正意義上的可控。

舉例

可控快取的具體實現可以參考潤乾報表的相關文件資料,這裡只是透過一個簡單的例子說明一下結果快取的使用方法:

首先使用潤乾報表內建的集算器編寫指令碼生成和讀取快取檔案,這個過程處於報表資料來源的計算階段。

A B C
1 E:\work\esProc\ / 快取目錄
2 =“sales_”+string(d_date) / 快取檔名,報表名 + 引數 (dfxName_ParamName)
3 =file(A1+A2)

4 if A3.exists()&& interval@s(A3.date(),now())<3600 result A3.import@b() end
5 =connect(“demo”)

6 =A5.cursor(“SELECT 客戶 ID,sum( 單價 * 數量) 訂單總額 FROM 訂單, 訂單明細 WHERE 訂單. 訂單 ID= 訂單明細. 訂單 ID and year(訂購日期)>? group by 客戶 ID order by 訂單總額 desc”,d_date)

7 =A6.fetch(5) >A5.close()
8 =A3.export@b(A7) / 生成快取檔案
9 return A7 / 為報表返回結果集

上述指令碼首先指定快取目錄,並根據引數設定快取檔名稱,再根據檔名查詢快取檔案是否存在(A4)。若存在且未超時則直接讀快取,否則直接連線資料庫取數運算,並將計算結果生成快取檔案。

對比一下,如果報表中不使用快取,那麼指令碼只需要這樣編寫:

A B
1 =connect(“demo”)
2 =A1.cursor(“SELECT 客戶 ID,sum( 單價 * 數量) 訂單總額 FROM 訂單, 訂單明細 WHERE 訂單. 訂單 ID= 訂單明細. 訂單 ID and year(訂購日期)>? group by 客戶 ID order by 訂單總額 desc”,d_date)
3 =A2.fetch(5) >A1.close()
4 return A3

然後,只需要在潤乾報表中呼叫上述集算指令碼,編輯報表表示式就可以完成報表製作了。

需要注意的是,潤乾報表的可控快取也有其適用場景,並不能完全取代常規快取。常規快取手段會連同報表計算結果以及呈現屬性一起儲存,而這裡的可控快取只快取資料,在呈現時還要再次進行外觀計算,因此更適用於資料計算強度較高,外觀計算強度較低的場景。實際應用中,兩者可以結合使用。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2667645/,如需轉載,請註明出處,否則將追究法律責任。

相關文章