2012-11-16 73 views
1

目前我有一個對象包含大量項目(在運行時不會更改),佔用大量內存,此對象將用於多個會話(每個用戶)和在每一箇中應該是相同的。帶事件的共享對象

因此,我不是在每個會話中複製大對象或創建新實例,而是決定將其用作共享資源。這樣每個會話將從對象的列表中讀取以獲取項目並完成它需要做的事情。我想節省內存,因爲這是一個Web應用程序。

但是,列表中的這些項目也有事件,每個會話都需要訂閱這些事件。

所以會發生什麼事情是當一個項目事件被觸發時,它在所有會話中觸發它。所以我不得不添加一些邏輯來檢查哪個會話觸發了這個事件,並且只在該會話中使用它。

有沒有更好的方法來做到這一點?更有效的方法?我擔心,如果我得到大量的用戶會話,當這些共享項目被觸發事件時,這會使處理過程陷入停滯。

你的想法是什麼?另外值得注意的是,在處理這些「項目」時,無法知道每個項目需要多長時間,因此我傾向於使用事件。

+0

也許在項目列表(引發事件的那個)中創建對象的本地副本。這樣,您仍然只需要大容器對象的一個​​副本,但通過允許每個會話都是自己的較小對象副本,事件應該是會話本地的。 – Kevin

+1

什麼是會話?它是一個網絡應用程序?您的應用程序是否針對所有用戶在單個流程中運行? 如何/你在哪裏存儲會話?在內存中(在web應用程序中的進程)還是在數據庫中?在內存會話存儲排序阻止您使用網絡農場 – Maarten

+0

同上,這是什麼類型的應用程序? – Paparazzi

回答

0

所以會發生什麼是當一個項目事件被觸發,它觸發它在所有 會議。所以我不得不添加一些邏輯來檢查哪個會話觸發了這個事件,並且只在該會話中使用它。

這意味着,只要有請求發起,最終觸發該事件的行動在共享數據的情況下仍然解僱,但你防止事件冒泡到每個會話。但是,這意味着事件處理程序是在共享數據和所有會話之間創建的。

有沒有更好的方法來做到這一點?更有效的方法?我害怕 ,如果我得到大量的用戶會話,當這些共享項目觸發事件時,這實際上會導致處理過程中出現問題 。

您的解決方案確實會造成一些問題。由於事件處理程序是在會話和共享數據之間創建的,因此會話過期時無法收集會話對象(我在此假設在會話外部時不清理事件處理程序,如果我錯了請更正)。後果:內存泄漏。

您的想法是什麼?另外值得注意的是,在處理這些「項目」時,無法知道每個項目需要多長時間,因此我傾向於使用 來使用事件。

我不知道我明白你的意思。當你不知道每個人需要多長時間時,爲什麼事件會解決問題?事件及其事件處理程序仍然按順序執行。

恐怕我不能給出更好的解決方案,因爲它不清楚我的共享數據是如何在會話應用程序之間共享的。你已經提到共享數據中的事件,但它們是如何工作的?你已經提到該事件只能由啓動該操作的會話處理,因此我想一種解決方案是在啓動共享數據操作時爲共享數據提供callback function。然後可以在必要時調用回調函數,這樣就不會創建將會話對象綁定到共享數據的事件處理程序,因此垃圾回收不應該成爲問題。

+0

嗯,我現在已經設置了所有項目都妥善處理,但我認爲我的結構需要重新考慮。這是其中的一個,讓我們這樣做,然後在一半的時間裏,需求已經發生了變化。無論如何感謝您的幫助。我只是繼續前進,並將其標記爲答案,因爲我正在按照您所描述的類似方式處理它。 – Carthorn