實現報表數據的可控緩存

使用緩存能夠提高報表性能是一個共識,通常高端報表工具都會提供報表緩存功能,將整個報表計算結果緩存在文件系統中,以便用戶下次訪問參數相同的報表時能夠快速讀取緩存結果進行展示。潤乾報表做爲報表工具的領軍品牌,固然也具備這種常規的緩存功能。數據庫

但在有些狀況下,報表開發人員還但願進一步控制緩存的內容,好比對於緩存內容,可能只想緩存一部分而不是整個報表結果,或者可以讓其它報表或程序複用緩存內容,又好比對於超時設置,可能但願爲不一樣的緩存結果設置不一樣的超時時間。這些需求都來自於實際業務中須要應對的數據量和實時性方面的不一樣狀況,也是通常報表工具的緩存功能沒法知足的。編程

潤乾報表內置了可編程的數據計算引擎(結合集算器實現),容許開發人員靈活控制緩存內容,稱爲可控緩存。可控緩存可以帶來更大的靈活性,下面就前面提到的三點展開介紹。緩存

一、緩存部分結果服務器

在報表開發中,有時並不但願將全部報表結果進行緩存,避免耗費太高的緩存成本(磁盤空間和應用服務器資源開銷)。另外,當報表中的部分數據實時性要求很高,須要實時與數據庫交互進行數據查詢,那麼就並不適合進行緩存。這種狀況下,經過潤乾報表的可控緩存能夠將變化不太頻繁的中間結果緩存起來。當報表再次請求時,實時性要求高的數據仍然從數據庫中讀取,同時結合緩存中的非實時數據進行報表計算,獲得最終報表結果集。常規緩存方案中沒有這種緩存部分結果的功能,只能設置整個報表是否進行緩存,這樣報表在涉及數據的不一樣時效性時就必須平衡二者的矛盾,而潤乾報表在這方面顯然更加靈活,效率更高。工具

二、緩存結果複用性能

潤乾報表中可控緩存是能夠複用的,一個報表的緩存結果(部分或所有)能夠被其餘報表或程序讀取並使用,而沒必要像常規報表緩存方案那樣重複緩存一樣的結果,這顯然也會大幅度提升緩存的總體效率。當其餘報表或程序使用某個報表的緩存結果時,只需從緩存(通常是磁盤文件)中讀取,並與報表中其餘數據來源(多是 DB、文件,或是另外一個報表的緩存)進行混合運算,就能獲得報表須要的結果集,處理方式和緩存部分結果的方式相似。常規的報表緩存以報表模板爲單位進行緩存,彼此沒法複用,會形成至關的資源浪費,增長不小的性能開銷,而潤乾報表在這方面一樣體現了靈活和高效。fetch

三、設置不一樣超時時間資源

緩存機制中必定會有超時時間,過期的緩存會被清除,報表再訪問時再從新緩存。通常報表工具的緩存超時時間在配置文件中設置,如一般的 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  

而後,只須要在潤乾報表中調用上述集算腳本,編輯報表表達式就能夠完成報表製做了。

須要注意的是,潤乾報表的可控緩存也有其適用場景,並不能徹底取代常規緩存。常規緩存手段會連同報表計算結果以及呈現屬性一塊兒保存,而這裏的可控緩存只緩存數據,在呈現時還要再次進行外觀計算,所以更適用於數據計算強度較高,外觀計算強度較低的場景。實際應用中,二者能夠結合使用。

相關文章
相關標籤/搜索