Posted on 2010-04-20 16:49
FineReport——報表技術領跑者 閱讀(355)
評論(3) 編輯 收藏 所屬分類:
Java報表技術知識
FineReport緩存技術包括數據集緩存和模板結果共享緩存,合理的使用緩存可以有效的提高性能。
一、數據集緩存
數據集緩存分為取數緩存和共享數據集
A. 取數緩存
FineReport的報表取數模型用的是叫做數據集(TableData)的二維表模型。而數據集緩存指的就是針對“數據庫查詢”這種數據集的取數過程所作的緩存。
背景:
數據庫查詢,就是通過SQL或者存儲過程,從數據庫服務器查詢取數據傳送到服務器以供報表執行用。通常這個取數的過程就是報表執行過程的一部分,因此報表的性能很大程度上依賴于取數的性能,而取數緩存就是為了解決這種性能問題而產生的。特別是數據量較大時,合理的使用緩存,可以控制性能表現。
原理:
我們知道服務器各個硬件的I/O性能是不同的,內存I/O >> 硬盤I/O >> 網絡 I/O, “>>”表示遠快于。在實際應用環境中,數據庫服務器和FineReport服務器通常是在不同的服務器上,它們之間的數據交互必須要通過網絡I/O來實現。而通常情況下,報表執行過程中可能對一條記錄需要使用多次,如果每次都需要到數據庫服務器上面去查詢取數,不但增加了數據庫的壓力,而且速度也會很慢。為什么我們不能在第一取數后,把該數據放到本地上的內存和磁盤上,從而提高性能。這就是一種“緩存”, 暫且稱為取數本地緩存。
如果把緩存放到本地,那么是放到內存還是磁盤上呢?既然內存I/O的速度比磁盤快很多,可不可以把所有的數據都放在內存上?可以是可以,但不一定是最好的選擇。因為相同容量的內存比磁盤的造價高很多,所以存儲的成本也要高很多。所以通常情況下,服務器的內存容量也會比磁盤小很多,如果數據庫的數據都放在內存上,就很容易造成OutOfMemory。另一個極端是把所有數據都放到磁盤上?這樣也不合算,因為雖然空間夠用了,但是速度卻不夠快。所以最好的解決方案是合理的分配內存和磁盤,把那些使用頻率最高的數據盡量放在內存中,從而提高在內存中的命中率。這是另一種“緩存”, 我們稱之為取數內存緩存。
綜上,可以看出,利用緩存技術來優化提高性能,是各種硬件性能造價的差異造成的合理結果。FineReport致力于研究合理的緩存技術來提高報表的性能。
缺陷:
緩存能夠很好的提高性能,但是也有一些缺陷,特別是實時數據敏感的應用。但對于通常的報表應用來說,影響并不大。
1. 拿取數本地緩存來說,數據緩存到本地后,在緩存存活有效期,再次取數時,就不會到數據庫取數了。如果此時數據庫的數據發生了更新,就不能及時的反應到本地。所以緩存會導致數據延遲,可能不是最新的數據。但是,這個數據延遲的時間可以通過參數來設定。
2. 對于服務器的集群來說,各個服務器之間的緩存需要同步化。比如:當客戶端第一次訪問報表服務器的時候,A機器計算了報表并在A機器作了緩存,當客戶端第二次訪問時,例如此時跳轉到B機器,B機器上找不到報表的緩存,也找不到參數的緩存,于是只好報錯或者重新計算。可以通過提供了集群服務器之間通訊的能力,解決負載均衡時服務器之間跳轉訪問帶來的緩存同步的問題。其原理是,首先,客戶端第一次訪問報表服務器,A機器計算了報表并在A機器作了緩存,當客戶端第二次訪問時,例如此時跳轉到B機器,B機器根據緩存id判斷出是A機器做的緩存,于是B機器向A機器發送緩存請求,A機器讀取緩存并把緩存結果發送給B機器,B機器再把結果返回給客戶端。
使用說明:
1. 取數本地緩存:服務器|緩存參數設置

FineReport6.5對于數據庫數據集內置了取數磁盤緩存技術,一般用戶不需要手動設置,上圖顯示了本地磁盤緩存的分頁大小。是否啟用本地磁盤緩存,會根據下面取數內存緩存面板中的“啟用磁盤緩存當記錄數大于”編輯框,當編輯框中為0時,表示一直啟用本地磁盤緩存
2.取數內存緩存:
打開報表設計器: 報表|數據集|數據集查詢

如上紅色箭頭所指編輯框,就是取數內存緩存設置的地方,編輯框中的數字表示查詢結果記錄集的記錄數大于多少時啟用本地磁盤緩存,否則使用取數內存緩存,-1表示全部緩存到內存。