FineReport緩存技術(shù)包括數(shù)據(jù)集緩存和模板結(jié)果共享緩存,合理的使用緩存可以有效的提高性能。
一、數(shù)據(jù)集緩存
數(shù)據(jù)集緩存分為取數(shù)緩存和共享數(shù)據(jù)集
A. 取數(shù)緩存
FineReport的報(bào)表取數(shù)模型用的是叫做數(shù)據(jù)集(TableData)的二維表模型。而數(shù)據(jù)集緩存指的就是針對(duì)“數(shù)據(jù)庫(kù)查詢”這種數(shù)據(jù)集的取數(shù)過(guò)程所作的緩存。
背景:
數(shù)據(jù)庫(kù)查詢,就是通過(guò)SQL或者存儲(chǔ)過(guò)程,從數(shù)據(jù)庫(kù)服務(wù)器查詢?nèi)?shù)據(jù)傳送到服務(wù)器以供報(bào)表執(zhí)行用。通常這個(gè)取數(shù)的過(guò)程就是報(bào)表執(zhí)行過(guò)程的一部分,因此報(bào)表的性能很大程度上依賴于取數(shù)的性能,而取數(shù)緩存就是為了解決這種性能問(wèn)題而產(chǎn)生的。特別是數(shù)據(jù)量較大時(shí),合理的使用緩存,可以控制性能表現(xiàn)。
原理:
我們知道服務(wù)器各個(gè)硬件的I/O性能是不同的,內(nèi)存I/O >> 硬盤I/O >> 網(wǎng)絡(luò) I/O, “>>”表示遠(yuǎn)快于。在實(shí)際應(yīng)用環(huán)境中,數(shù)據(jù)庫(kù)服務(wù)器和FineReport服務(wù)器通常是在不同的服務(wù)器上,它們之間的數(shù)據(jù)交互必須要通過(guò)網(wǎng)絡(luò)I/O來(lái)實(shí)現(xiàn)。而通常情況下,報(bào)表執(zhí)行過(guò)程中可能對(duì)一條記錄需要使用多次,如果每次都需要到數(shù)據(jù)庫(kù)服務(wù)器上面去查詢?nèi)?shù),不但增加了數(shù)據(jù)庫(kù)的壓力,而且速度也會(huì)很慢。為什么我們不能在第一取數(shù)后,把該數(shù)據(jù)放到本地上的內(nèi)存和磁盤上,從而提高性能。這就是一種“緩存”, 暫且稱為取數(shù)本地緩存。
如果把緩存放到本地,那么是放到內(nèi)存還是磁盤上呢?既然內(nèi)存I/O的速度比磁盤快很多,可不可以把所有的數(shù)據(jù)都放在內(nèi)存上?可以是可以,但不一定是最好的選擇。因?yàn)橄嗤萘康膬?nèi)存比磁盤的造價(jià)高很多,所以存儲(chǔ)的成本也要高很多。所以通常情況下,服務(wù)器的內(nèi)存容量也會(huì)比磁盤小很多,如果數(shù)據(jù)庫(kù)的數(shù)據(jù)都放在內(nèi)存上,就很容易造成OutOfMemory。另一個(gè)極端是把所有數(shù)據(jù)都放到磁盤上?這樣也不合算,因?yàn)殡m然空間夠用了,但是速度卻不夠快。所以最好的解決方案是合理的分配內(nèi)存和磁盤,把那些使用頻率最高的數(shù)據(jù)盡量放在內(nèi)存中,從而提高在內(nèi)存中的命中率。這是另一種“緩存”, 我們稱之為取數(shù)內(nèi)存緩存。
綜上,可以看出,利用緩存技術(shù)來(lái)優(yōu)化提高性能,是各種硬件性能造價(jià)的差異造成的合理結(jié)果。FineReport致力于研究合理的緩存技術(shù)來(lái)提高報(bào)表的性能。
缺陷:
緩存能夠很好的提高性能,但是也有一些缺陷,特別是實(shí)時(shí)數(shù)據(jù)敏感的應(yīng)用。但對(duì)于通常的報(bào)表應(yīng)用來(lái)說(shuō),影響并不大。
1. 拿取數(shù)本地緩存來(lái)說(shuō),數(shù)據(jù)緩存到本地后,在緩存存活有效期,再次取數(shù)時(shí),就不會(huì)到數(shù)據(jù)庫(kù)取數(shù)了。如果此時(shí)數(shù)據(jù)庫(kù)的數(shù)據(jù)發(fā)生了更新,就不能及時(shí)的反應(yīng)到本地。所以緩存會(huì)導(dǎo)致數(shù)據(jù)延遲,可能不是最新的數(shù)據(jù)。但是,這個(gè)數(shù)據(jù)延遲的時(shí)間可以通過(guò)參數(shù)來(lái)設(shè)定。
2. 對(duì)于服務(wù)器的集群來(lái)說(shuō),各個(gè)服務(wù)器之間的緩存需要同步化。比如:當(dāng)客戶端第一次訪問(wèn)報(bào)表服務(wù)器的時(shí)候,A機(jī)器計(jì)算了報(bào)表并在A機(jī)器作了緩存,當(dāng)客戶端第二次訪問(wèn)時(shí),例如此時(shí)跳轉(zhuǎn)到B機(jī)器,B機(jī)器上找不到報(bào)表的緩存,也找不到參數(shù)的緩存,于是只好報(bào)錯(cuò)或者重新計(jì)算。可以通過(guò)提供了集群服務(wù)器之間通訊的能力,解決負(fù)載均衡時(shí)服務(wù)器之間跳轉(zhuǎn)訪問(wèn)帶來(lái)的緩存同步的問(wèn)題。其原理是,首先,客戶端第一次訪問(wèn)報(bào)表服務(wù)器,A機(jī)器計(jì)算了報(bào)表并在A機(jī)器作了緩存,當(dāng)客戶端第二次訪問(wèn)時(shí),例如此時(shí)跳轉(zhuǎn)到B機(jī)器,B機(jī)器根據(jù)緩存id判斷出是A機(jī)器做的緩存,于是B機(jī)器向A機(jī)器發(fā)送緩存請(qǐng)求,A機(jī)器讀取緩存并把緩存結(jié)果發(fā)送給B機(jī)器,B機(jī)器再把結(jié)果返回給客戶端。
使用說(shuō)明:
1. 取數(shù)本地緩存:服務(wù)器|緩存參數(shù)設(shè)置

FineReport6.5對(duì)于數(shù)據(jù)庫(kù)數(shù)據(jù)集內(nèi)置了取數(shù)磁盤緩存技術(shù),一般用戶不需要手動(dòng)設(shè)置,上圖顯示了本地磁盤緩存的分頁(yè)大小。是否啟用本地磁盤緩存,會(huì)根據(jù)下面取數(shù)內(nèi)存緩存面板中的“啟用磁盤緩存當(dāng)記錄數(shù)大于”編輯框,當(dāng)編輯框中為0時(shí),表示一直啟用本地磁盤緩存
2.取數(shù)內(nèi)存緩存:
打開(kāi)報(bào)表設(shè)計(jì)器: 報(bào)表|數(shù)據(jù)集|數(shù)據(jù)集查詢

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