靜態(tài)并發(fā)控制
應(yīng)用服務(wù)器的承載能力是有限的,當(dāng)并發(fā)的用戶數(shù)超過(guò)其承載能力,服務(wù)器肯定要出錯(cuò)。因此,控制并發(fā)數(shù)的能力是必須的。
最常用的辦法是靜態(tài)并發(fā)控制,FineReport就提供了這樣的辦法,其基本思路是:在服務(wù)器端預(yù)先配置允許并發(fā)的最大線程數(shù),當(dāng)請(qǐng)求線程超出了這個(gè)數(shù),就采用一種策略保證當(dāng)前的線程數(shù)不超過(guò)最大線程數(shù),同時(shí)保證等待的線程能進(jìn)來(lái)計(jì)算,客戶端不會(huì)出現(xiàn)很大的延遲。
動(dòng)態(tài)并發(fā)控制
當(dāng)服務(wù)器對(duì)性能要求比較高的時(shí)候,光有靜態(tài)并發(fā)控制是不夠的。舉例來(lái)說(shuō),服務(wù)器限定了允許最大20個(gè)線程訪問(wèn),平均每個(gè)線程占用內(nèi)存20m,總計(jì)服務(wù)器可以接受400M內(nèi)存的耗用。可是,當(dāng)正好每個(gè)線程訪問(wèn)的報(bào)表數(shù)據(jù)量都非常小時(shí),也許20個(gè)線程加起來(lái)耗用的內(nèi)存不足100M,此時(shí)多余的300M內(nèi)存就浪費(fèi)了;如果正好20個(gè)線程中某幾個(gè)線程訪問(wèn)的報(bào)表數(shù)據(jù)量非常大,有可能一個(gè)線程占用的內(nèi)存就超過(guò)100M,此時(shí)20個(gè)線程加起來(lái)占用內(nèi)存可能遠(yuǎn)遠(yuǎn)超過(guò)400M,直接導(dǎo)致服務(wù)器內(nèi)存溢出。同樣的道理,對(duì)于CPU占用也是適用的。
因此,FineReport報(bào)表在提供簡(jiǎn)單靜態(tài)并發(fā)數(shù)控制的基礎(chǔ)上,為了合理的資源分配,并保證服務(wù)器的安全和流暢性,同時(shí)引入了動(dòng)態(tài)并發(fā)控制的概念。
根據(jù)服務(wù)器硬件和Java虛擬機(jī)的配置,在服務(wù)器運(yùn)算的過(guò)程中,動(dòng)態(tài)的判斷當(dāng)前并發(fā)訪問(wèn)的所占用的資源是否達(dá)到預(yù)設(shè)值,如果已經(jīng)達(dá)到預(yù)設(shè)值,則控制新進(jìn)訪問(wèn)線程。
這種動(dòng)態(tài)并發(fā)控制,和簡(jiǎn)單的并發(fā)數(shù)控制結(jié)合使用,更加靈活,更加合理。
緩存報(bào)表執(zhí)行結(jié)果
在并發(fā)訪問(wèn)的機(jī)制下,經(jīng)常出現(xiàn)同一報(bào)表被不同用戶連續(xù)多次重復(fù)訪問(wèn),此時(shí)如果能夠把第一次算出的報(bào)表緩存下來(lái),再次訪問(wèn)時(shí)直接從緩存中讀取,則可以大大減少服務(wù)器的運(yùn)算消耗。并且因?yàn)楣?jié)省了報(bào)表的執(zhí)行過(guò)程,可以大大加快訪問(wèn)速度。
對(duì)于帶有參數(shù)的報(bào)表,當(dāng)用戶采用相同的參數(shù)進(jìn)行重復(fù)訪問(wèn)時(shí),也可以利用緩存,減少重復(fù)的計(jì)算。對(duì)于帶有不同參數(shù)的報(bào)表會(huì)緩存不同的報(bào)表執(zhí)行結(jié)果。因此如果第二次這第一次執(zhí)行的參數(shù)不一樣,報(bào)表就會(huì)重新計(jì)算,并緩存該報(bào)表和參數(shù)對(duì)應(yīng)的結(jié)果報(bào)表。因此,對(duì)于有參數(shù)的報(bào)表來(lái)說(shuō),緩存時(shí)還必須識(shí)別參數(shù)的值。
打開(kāi)菜單:服務(wù)器|緩存設(shè)置,設(shè)置報(bào)表直接結(jié)果緩存參數(shù),如下圖所示
