這讓我瘋狂。我們試圖構建一個CF memcached包裝器。我們有一個memcached.cfc成分是這樣的:在Coldfusion陣列中丟失物品
<cfset this.m = arraynew(1)>
<cffunction name="init" access="public" output="false">
<cfif not isdefined("application.memcached")
....
<cfscript>
setup();
</cfscript>
...
<cfset application.memcached = this>
</cfif>
<cfreturn application.memcached>
</cffunction>
<cffunction name="setup" access="private" output="false">
<cftry>
<cfset this.m = arraynew(1)>
<cfloop from="1" to="#this.poolSize#" index="i">
<cfset this.m[i] = createClient()>
</cfloop>
<cflog application="no" file="memcached" text="Successfully set up #this.poolSize# new memcache clients">
<cfcatch>
<cflog application="no" file="memcached" text="Exception in setup() while setting up the pool: type: #cfcatch.type#, message: #cfcatch.message#, detail: #cfcatch.detail#">
</cfcatch>
</cftry>
</cffunction>
<cffunction name="createClient" access="private" output="false">
<cfset var AU = createObject("java", "net.spy.memcached.AddrUtil").init()>
<cfset var c = createObject("java", "net.spy.memcached.MemcachedClient").init(AU.getAddresses("127.0.0.1:11211"))>
<cfreturn c>
</cffunction>
<cffunction name="getCache" access="public" returntype="any" output="false">
<cfset idx = ceiling(rand() * 20)>
<cfreturn application.memcached.m[idx]>
</cffunction>
奇怪的是,30分鐘左右的運行之後,getCache開始出現問題說有在application.memcached沒有項目。 m數組在idx位置。
這怎麼可能發生? CF數組是否使用弱引用或其他?當然,一旦數組填充了20個客戶端,數組應該始終保持滿狀態。
每個新客戶生成一個新的線程,所以一旦我們失去了參考客戶現在有辦法將其關閉,並且線程生活在那裏永遠服用內存。請問,我錯過了什麼?
順便說一句,這是一個很長一段時間我最後實現了一個CFC ..但我認爲你可以調用一個函數 。我不知道,雖然:) –
duedl0r
你需要varscope的「I」你的設置功能和你的getCache函數中的'idx'。 – duncan