數據集共享(也稱SQL共享)
對于同一個報表的并發很多,或者不同的報表使用同樣的數據集時,可以使用這個優化手段。
原理:
當多個報表在服務器端執行的時候,他們可能使用同樣的數據庫查詢數據集。同樣指的是這些數據庫查詢,經過參數處理后(在有參數的情況下),生成的SQL是相同的。他們是不同的數據集,所以需要分別到數據庫去執行SQL查詢,取數等等,但他們做的卻是同樣的重復的事情,如果能夠重用共享他們,使用同樣的取數過程,不但可以節省下數據庫資源,而且還可以提高取數的速度。這就是所謂數據集共享,也稱SQL共享。
在多個客戶端同時請求同一個報表模板時候,如果使用了數據集共享,原先的多個數據查詢取數過程,現在只需要一個就可以完成。更進一步,不同的模板也可以使用同樣的數據集,它們也可以共享。
FineReport的數據集共享是全局的,用戶可以自己設置是否共享。每個數據庫查詢數據集都有一個“是否共享數據集”的屬性。希望共享時,可以設置這個屬性為true。當一個數據集共享之后,并非所有“同樣的”數據集都可以共享此數據集,只有那些共享屬性也為true的數據集才能共享。
舉個例子,如果A、B兩個數據集,一個共享,另一個不共享,則他們仍然是不同的取數過程。當A、B都共享時,就是同一個取數過程了。簡言之,所有的共享的數據集集合分享同一個取數過程。
使用說明:
一個數據集如果希望共享,也就是希望加入其SQL對應的共享部落,只需要設置一下共享屬性,打鉤就行。如下:
打開報表設計器: 報表|數據集|數據集查詢

打鉤表示共享。
二、模板結果共享緩存
顧名思義,“模板結果共享緩存”就是把報表的執行結果緩存下來,存成cpt,pdf等文件,在多次訪問之間共享同樣的執行結果。
原理:
我們在前面的取數緩存原理中提到過,可以利用不同硬件I/O之間性能造價差異,使用緩存來提高效率,那我們這邊的緩存是利用的什么性能“差異”呢?先看一個例子:
客戶端A訪問服務器上的報表設計模板,進過FineReport模型取數執行后,生成想要的模板結果文件,緩存到某處,并傳回客戶端。
而客戶B訪問服務器發現他想要的模板結果文件就是A緩存的那些文件,于是不經過報表模型的處理,直接去拿A緩存的那些文件,然后傳回客戶端。
如果要從原始模板得到客戶端想要的結果模板,需要經過“FineReport模型”這一“中間層”處理產生,除非“它已經在那兒”。
由此我們可以得到與取數緩存類似的結論(“>>”表示遠快于):
去某處緩存取模板結果 >> 通過報表模型產生模板結果
這邊的“FineReport模型”是不很像“網絡I/O”中的“網線”或者“中轉站”。
正如Paul Graham所說:最純粹、最抽象的設計難題之一,就是設計橋梁。你面對的問題,基本上就是如何使用最少的材料,跨越給定的距離。
使用說明:
為了說明報表結果緩存怎么使用,用一個例子配合說明。
步驟一:
新建一個報表,在單元格A1中寫公式=Now()

步驟二:
保存為now.cpt

步驟三:
服務器|緩存設置
設置模板共享緩存生存時間為10s。

步驟四:
首先是沒有使用模板共享緩存的情況下,點擊分頁預覽按鈕。
http://localhost:8075/WebReport/ReportServer?reportlet=now.cpt

不斷的刷新瀏覽器,會看到時間會不斷刷新,說明每次都會經過FineReport模型計算
步驟五:
修改url,在后面加上__cache__=true,表示使用模板共享緩存,如下:
http://localhost:8075/WebReport/ReportServer?reportlet=now.cpt&__cache__=true
不斷刷新瀏覽器,會看到在10秒以內,時間不會變化,但是一旦超過10s,顯示的時間就會更新,說明模板共享緩存起作用了。
另外,模板共享緩存的使用借鑒了數據集緩存的想法,就是只有兩個模板的訪問地址都有__cache__=true的時候,他們才會共享模板結果,此時如果另一個訪問希望使用緩存,只要在url后面加上__cache__=true就行了。如果一個帶有__cache__=true參數的模板第一次訪問時沒有緩存,則會創建緩存,緩存超過“最大生存時間”或著未被使用的時間超過“最大空閑”時間,那么會自動更新緩存。所以,可以根據對數據時效的敏感程度不同設置“最大生存時間”。
三、緩存設置面板的使用說明
打開設計器,服務器|緩存設置

1. 緩存路徑設置,是報表服務器上所有緩存數據存放的路徑,此路徑一般需要在部署時設置。
2. 內存緩存容量是使用取數本地緩存時,每個數據集最大的內存容量,默認為48MB
3. 數據集和結果模板的共享屬性設置中包括4項:
最大活動對象,是指在緩存容器中最大放置的緩存對象個數,如果活動對象數超過此數目,則服務器會根據下面的緩存策略來選擇哪些對象留下,哪些被去除,FIFO表示先進來的先出去。
最大空閑時間指的是緩存對象在容器中停留不被使用不能超過的時間,也就是空閑的時間,如果空閑的時間超過這個時間,此對象就會被移除。
最大生存時間指的是緩存對象在容器中存活的最大時間,無論是否活動,一旦超過此時間,此緩存對象就失效,將會被移除。
如何靈活協調的設置這些參數,需要根據上面說的那些原理來確定。沒有明確原因時,不建議改動。