臨時(shí)資源生命周期的(de)管理采取以(yǐ)下策略:在(zài)确保服務器端内存、硬盤空間等資源占用可控的(de)前提下盡可能延長生命周期,或選擇将臨時(shí)資源存儲在(zài)MongoDB中。
此外,生命周期内,重啓服務後,存儲在(zài)本地(dì / de)的(de)臨時(shí)資源會被清空。
此處主要(yào / yāo)爲(wéi / wèi)您介紹如何在(zài)配置文件中配置臨時(shí)資源存儲,在(zài) iServer 頁面上(shàng)配置臨時(shí)資源存儲請參見臨時(shí)資源存儲設置。
使用本地(dì / de)存儲臨時(shí)資源
您可以(yǐ)在(zài)系統配置文件(【SuperMap iServer 安裝目錄】\webapps\iserver\WEB-INF\iserver-system.xml)中,設置使用本地(dì / de)存儲臨時(shí)資源,包括内存空間阈值maxBytesOnHeap和(hé / huò)磁盤空間阈值maxBytesLocalDisk。其中,maxBytesOnHeap 默認爲(wéi / wèi)100M,maxBytesLocalDisk 默認爲(wéi / wèi)10G,您可根據需要(yào / yāo),自行設置所需的(de)空間大(dà)小。還支持添加<diskStorePath>參數,設置臨時(shí)資源在(zài)磁盤中存存儲路徑,默認的(de)存儲路徑爲(wéi / wèi)【SuperMap iServer Java 安裝目錄】\temp\tmpResources。清理臨時(shí)資源時(shí)使用的(de)算法,可以(yǐ)通過添加<memoryStoreEvictionPolicy>參數來(lái)設置。此外, 更多參數設置請參考:EhcacheRepoSetting
<!-- 臨時(shí)資源存儲配置--> <repository class="com.supermap.services.rest.repository.EhcacheRepoProvider" name="localRepository"> <!-- 臨時(shí)資源存儲在(zài)本地(dì / de) --> <config class="com.supermap.services.rest.repository.EhcacheRepoSetting"> <!--最大(dà)允許占用的(de)内存大(dà)小--> <maxBytesOnHeap>200m</maxBytesOnHeap> <!--最大(dà)允許占用的(de)磁盤空間大(dà)小--> <maxBytesLocalDisk>10g</maxBytesLocalDisk> <!-- 磁盤存儲路徑 --> <diskStorePath>D:\SuperMapiServer8C\temp\tmpResources</diskStorePath> <!-- 清理臨時(shí)資源使用的(de)算法 --> <memoryStoreEvictionPolicy>LRU</memoryStoreEvictionPolicy> <!--掃描存儲在(zài)磁盤上(shàng)數據是(shì)否過期的(de)間隔時(shí)間,單位是(shì)秒--> <diskExpiryThreadIntervalSeconds>120</diskExpiryThreadIntervalSeconds> </config> </repository>
- 内存空間阈值
由于(yú)臨時(shí)資源存放在(zài)内存中可以(yǐ)保證存取的(de)效率,但是(shì)占用的(de)内存空間太大(dà)時(shí)又會影響服務器運行效率,因此需要(yào / yāo)設置一(yī / yì /yí)個(gè)相對合理的(de)内存空間阈值。當臨時(shí)資源占用的(de)内存超過這(zhè)個(gè)阈值的(de)時(shí)候,服務端将默認采用 LRU 算法(Least Recently Used)對臨時(shí)資源進行處理,即把最近最少使用的(de)臨時(shí)資源緩存删除。删除臨時(shí)資源的(de)算法默認爲(wéi / wèi)LRU算法,可以(yǐ)通過<memoryStoreEvictionPolicy>參數來(lái)設置。
- 硬盤二級緩存阈值
由于(yú)保存在(zài)内存中的(de)臨時(shí)資源有限,爲(wéi / wèi)保證其存活周期,iServer支持将臨時(shí)資源保存在(zài)硬盤中,如果客戶端請求的(de)資源在(zài)内存中訪問不(bù)到(dào),系統會去硬盤中查找。 當這(zhè)些臨時(shí)資源緩存占用的(de)空間太大(dà)時(shí),同樣可能會影響服務器的(de)運行,因此也(yě)需要(yào / yāo)設置保存臨時(shí)資源的(de)磁盤空間阈值。當臨時(shí)資源占用的(de)磁盤空間超過這(zhè)個(gè)阈值的(de)時(shí)候,将進行緩存清理。緩存清理時(shí),同樣采用 LRU 算法。
使用MongoDB存儲臨時(shí)資源
由于(yú)本地(dì / de)存儲臨時(shí)資源的(de)資源存儲空間有限,因此存活時(shí)間也(yě)會受限。SuperMap iServer 支持使用 MongoDB 存儲臨時(shí)資源,可有效延長臨時(shí)資源的(de)存活時(shí)間。此外,MongoDB 也(yě)可用于(yú)多進程模式下的(de)臨時(shí)資源存儲,使各進程間資源可共享。
配置 MongoDB 存儲臨時(shí)資源的(de)方法爲(wéi / wèi):在(zài)系統配置文件中,開啓“基于(yú)MongoDB的(de)臨時(shí)資源存儲配置”,并注釋本地(dì / de)存儲配置。如下:
<!-- 基于(yú)MongoDB的(de)臨時(shí)資源存儲配置 --> <repository class="com.supermap.services.rest.repository.MongoDBObjSerializeRepoProvider" name="mongoRepository"> <config class="com.supermap.services.rest.repository.MongoDBRepoSetting"> <host>localhost</host> <port>27017</port> <dbName>SuperMap</dbName> </config> </repository>
在(zài)host參數中輸入您使用的(de)MongoDB的(de)服務地(dì / de)址,在(zài)port參數中輸入端口号,在(zài)dbName中輸入數據庫名稱(此處需要(yào / yāo)輸入已存在(zài)的(de)數據庫名稱)。如果使用的(de)MongoDB開啓了(le/liǎo)安全控制,通過添加<username>和(hé / huò)<password>參數,添加數據庫的(de)用戶名和(hé / huò)密碼。詳細參數設置可參考:MongoDBRepoSetting
使用 Redis 存儲臨時(shí)資源
SuperMap iServer 支持将臨時(shí)資源存儲在(zài) Redis 中,也(yě)支持将其用于(yú)多進程模式下的(de)臨時(shí)資源存儲,使各進程間資源可共享。配置 Redis 臨時(shí)資源存儲的(de)方法爲(wéi / wèi):在(zài) iserver-system.xml 文件中開啓“基于(yú) Redis 的(de)臨時(shí)資源存儲配置”,并注釋其他(tā)類型的(de)臨時(shí)資源存儲配置。
<!-- 基于(yú) Redis 的(de)臨時(shí)資源存儲配置 --> <repository class="com.supermap.services.rest.repository.RedisRepoProvider"> <config class="com.supermap.services.rest.repository.RedisRepoSetting"> <type>Redis</type> <host>192.168.17.116</host> <port>6379</port> <username>SuperMap</username> <password>SuperMap</password> </config> </repository>
<host>:【必填】Redis 的(de)服務地(dì / de)址。
<port>:【必填】Redis 端口号,默認爲(wéi / wèi) 6379。
<username>:數據庫所有者的(de)用戶名。
<password>:該數據庫所有者的(de)密碼。
此外, 更多參數設置請參考:RedisRepoSetting
使用HSQLDB存儲臨時(shí)資源
在(zài)多進程模式下,當iServer系統配置文件中沒有臨時(shí)資源存儲配置,或設置的(de)臨時(shí)資源存儲配置(如本地(dì / de)存儲)不(bù)支持在(zài)多進程模式下使用時(shí),則默認使用HSQLDB存儲臨時(shí)資源。在(zài)單進程模式下,您也(yě)可以(yǐ)配置使用HSQLDB存儲,使同一(yī / yì /yí)台機器中的(de)多個(gè)iServer共享臨時(shí)資源。
配置HSQLDB存儲臨時(shí)資源的(de)方法爲(wéi / wèi):在(zài)系統配置文件中,開啓“基于(yú)HSQLDB的(de)臨時(shí)資源存儲配置”,并注釋本地(dì / de)存儲配置和(hé / huò)MongoDB存儲配置。如下:
<!-- 基于(yú)HSQLDB的(de)臨時(shí)資源存儲配置 --> <repository class="com.supermap.services.rest.repository.HsqldbRepoProvider" name="localRepository"> <config class="com.supermap.services.rest.repository.HsqldbRepoSetting"> <port>10070</port> <startServer>true</startServer> </config> </repository>
在(zài)<port>參數中填設置HSQLDB存儲端口号,默認爲(wéi / wèi)10070。<startServer>參數表示是(shì)否啓動HSQLDB。當一(yī / yì /yí)台機器中啓動了(le/liǎo)多個(gè)iServer時(shí),隻需在(zài)其中一(yī / yì /yí)個(gè)iServer中設置該參數,并将值設置爲(wéi / wèi)true。
注意:如果在(zài)配置文件中,同時(shí)設置了(le/liǎo)多種臨時(shí)資源存儲方式,則默認使用文件中的(de)第一(yī / yì /yí)種 。
使用 Caffeine 存儲臨時(shí)資源
iServer 支持将臨時(shí)資源存儲在(zài) Caffeine 中,Caffeine 是(shì)一(yī / yì /yí)種内存緩存。配置 Caffeine 臨時(shí)資源存儲的(de)方法爲(wéi / wèi):在(zài) iserver-system.xml 文件中開啓“基于(yú) Caffeine 的(de)臨時(shí)資源存儲配置”,并注釋其他(tā)類型的(de)臨時(shí)資源存儲配置。當完成以(yǐ)上(shàng)配置後啓動 iServer,Caffeine 緩存即可用。
<!-- 基于(yú) Caffeine 的(de)臨時(shí)資源存儲配置 --> <repository class="com.supermap.services.rest.repository.CaffeineRepoProvider" name="localRepository"> <repository class="com.supermap.services.rest.repository.CaffeineRepoProvider" name="localRepository"> <maximumSize>1000</maximumSize> <expireAfterAccess>3.0</expireAfterAccess> </config> </repository>
<maximumSize>:緩存的(de)最大(dà)對象數
<expireAfterAccess>:訪問後過期時(shí)間,即過一(yī / yì /yí)定時(shí)間後不(bù)訪問(讀取或者寫入),存儲的(de)數據會被銷毀,過期時(shí)間單位爲(wéi / wèi)小時(shí)。
使用 PostgreSQL、Kingbase、GaussDB、Vastbase存儲臨時(shí)資源
iServer 支持将臨時(shí)資源存儲在(zài) PostgreSQL 、Kingbase、GaussDB、Vastbase中,四者配置方法相同。
以(yǐ)PostgreSQL爲(wéi / wèi)例, PostgreSQL是(shì)一(yī / yì /yí)種内存緩存。配置 PostgreSQL 臨時(shí)資源存儲的(de)方法爲(wéi / wèi):在(zài) iserver-system.xml 文件中開啓“基于(yú) PostgreSQL 的(de)臨時(shí)資源存儲配置”,并注釋其他(tā)類型的(de)臨時(shí)資源存儲配置。以(yǐ)上(shàng)配置完成後 PostgreSQL 緩存即可用,無需啓動 iServer。
<!-- 基于(yú) PostgreSQL 的(de)臨時(shí)資源存儲配置 --> <repository class="com.supermap.services.rest.repository.PostgresRepoProvider"> <config class="com.supermap.services.rest.repository.PostgresRepoSetting"> <type>Postgres</type> <jdbcUrl>jdbc:postgresql://ip:port/dbname?currentSchema=public&characterEncoding=utf8&useSSL=false</jdbcUrl> <username>username</username> <password>yubokLIRWThaAAhkOXBtiw..</password> <cacheSize>21</cacheSize> <expireTime>3</expireTime> <deleteTimeSpan>2</deleteTimeSpan> <autoCreateTable>true</autoCreateTable> </config> </repository>
<type>:數據庫類型,使用 PostgreSQL 數據庫時(shí),這(zhè)裏填寫 Postgres。注:PostgreSQL、Kingbase、GaussDB、Vastbase數據庫在(zài) iserver-system.xml文件中僅<type>值不(bù)同,分别爲(wéi / wèi)Postgres、Kingbase、GaussDB、Vastbase。
<jdbcUrl>:數據庫的(de)連接信息。其中,ip 爲(wéi / wèi)數據庫的(de) ip 地(dì / de)址,port 爲(wéi / wèi)數據庫的(de)端口,dbname 爲(wéi / wèi)數據庫名稱,? 後面的(de)爲(wéi / wèi)數據庫的(de)一(yī / yì /yí)些參數信息。例如:jdbc:postgresql://127.0.0.1:5432/Testbase?currentSchema=public&characterEncoding=utf8&useSSL=false。
<cacheSize>:緩存個(gè)數,指在(zài)數據庫中最高支持存儲的(de)緩存數量,如不(bù)設置則使用默認值 100。當緩存數量達到(dào)上(shàng)限時(shí),将删除近期使用最少的(de)緩存記錄。
<expireTime>:資源過期時(shí)限,單位爲(wéi / wèi)分鍾。從該資源最後一(yī / yì /yí)次被使用起算,若持續未使用的(de)時(shí)長大(dà)于(yú)資源過期時(shí)限,則 iServer 将判斷該資源過期。
<deleteTimeSpan>:删除過期數據庫資源的(de)時(shí)間間隔,單位爲(wéi / wèi)分鍾。該操作的(de)起算時(shí)間爲(wéi / wèi)初次使用數據庫臨時(shí)資源存儲的(de)時(shí)間,每至設置的(de)間隔時(shí)間點,将删除過期的(de)資源。
設置存活時(shí)間阈值
臨時(shí)資源的(de)緩存不(bù)論存在(zài)于(yú)内存空間還是(shì)硬盤中,當超過一(yī / yì /yí)定存活時(shí)間時(shí),臨時(shí)資源緩存将直接被删除。
SuperMap iServer Java 6R(2012) SP1及以(yǐ)前的(de)版本中, 某些資源如 tempLayersSet、trackingLayer、queryResults 的(de)臨時(shí)子(zǐ)資源的(de)生命周期是(shì)通過 holdTime 參數來(lái)控制的(de),客戶端或用戶可以(yǐ)設置臨時(shí)資源的(de)存活時(shí)間,默認爲(wéi / wèi)15(分鍾)。
SuperMap iServer Java 6R(2012) SP2 及以(yǐ)後的(de)版本中,支持在(zài)服務配置文件(iserver-services-interfaces.xml)中設置接口配置參數 defaultHoldTime,用于(yú)設定臨時(shí)資源(如 tempLayersSet、trackingLayer、queryResults 等)默認保存時(shí)間,默認爲(wéi / wèi)7天,設置後對 REST 接口的(de)所有臨時(shí)資源的(de)存活時(shí)間都生效。 設置方法爲(wéi / wèi):
<interface class="com.supermap.services.rest.RestServlet" name="rest"> <config class="com.supermap.services.rest.RestConfig"> <accessControlAllowOrigin>*</accessControlAllowOrigin> <!-- rest 資源默認保存時(shí)間,單位是(shì)分鍾--> <defaultHoldTime>10080</defaultHoldTime> </config> </interface> <interface class="com.supermap.services.rest.JaxrsServletForJersey" name="restjsr"> <config class="com.supermap.services.rest.JaxrsConfigForJersey"> <accessControlAllowOrigin>*</accessControlAllowOrigin> <!-- rest 資源默認保存時(shí)間,單位是(shì)分鍾--> <defaultHoldTime>10080</defaultHoldTime> </config> </interface>
臨時(shí)資源列表
所有 POST 請求創建的(de)資源都爲(wéi / wèi)臨時(shí)資源,具體資源示例如下: