2009/04/05

來po點有深度的東西…

最近Blog一直都是些沒什麼營養的內容,來po點有深度的東西好了…

這陣子遇到了兩個問題,都是很複雜、有點不知該如何下手的問題,寫在這邊,看有沒有路人經過看到,可以好心指點我一下…

1. 在使用CodePlex上的Unity時,在不知何種情況下,發生NullReferenceException。
從Exception的內容看來,是在使用Collections.Generic.Dictionary的時候,在internal insert value時,發生的null reference,但是我嘗試過,卻無法reproduce這種情況,甚至猜想是否是發生在high loading時發生的,也嘗試使用multi-threading進行打壓,但就是沒辦法知道在何種條件下可以發生這種錯。(但偏偏這種錯,在很偶爾的情況下就是會發生,這將影響系統的穩定性)

System.NullReferenceException: Object reference not set to an instance of an object.
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value)
at Microsoft.Practices.Unity.NamedTypesRegistry.RegisterType(Type t, String name)
at Microsoft.Practices.Unity.UnityDefaultBehaviorExtension.OnRegister(Object sender, RegisterEventArgs e)
at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
at Microsoft.Practices.Unity.UnityContainer.RegisterType(Type from, Type to, String name, LifetimeManager lifetimeManager)
at Microsoft.Practices.Unity.Configuration.UnityTypeElement.Configure(IUnityContainer container)
at Microsoft.Practices.Unity.Configuration.UnityContainerElement.Configure(IUnityContainer container)

2. 我們以WCF並使用Enterprise Library Cache Application Block提供一個Caching service,但是當end user使用這個service來存取cache時,卻發生資料錯亂的情況…

A: SetCache(“a”,“abc”)
A: GetCache(“a”) return : “abc”

B: GetCache(“a”) return : “abc”
B: SetCache(“a”, “123”)
B: GetCache(“a”) return : “123”

A: GetCache(“a”) return : “”
A: SetCache(“a”, “qqq”)
A: GetCache(“a”) return : “123”

如此之類的,反正A到第二次來GetCache時,就會有錯亂的機會發生,但是這是以.Net寫的client來呼叫web service的時候發生,如果直接使用兩台電腦,並以SOAP UI來try,卻是正常的,但透過SOAP UI與.Net的client交互來試,卻又會發生,連SOAP UI也會抓到錯誤的值…
想說不知是不是跟http request被cache有關? 但感覺又不太像…
程式的內容也很簡單,看不出有不合邏輯的地方…難道是Enterprise Library裡寫的邏輯,跟我們使用的情境上會發生問題? 這更不make sense….

好吧…如果真的有找到解法…再來解釋…

1 則留言:

joewu 提到...

針對Cache的問題,在嘗試把IIS Application Pool獨立出來後,問題似乎解決了?
難道是因為記憶體共用而導致的混亂嗎?

My World