2012-12-12 84 views
1

我正在使用ASP.NET的Web應用程序。我有一個名爲「Sistema」的類使用Singleton模式。ArrayList變爲空

創建Sistema實例時,打開數據庫連接並運行一個進程,將一些靜態信息加載到多個ArrayList中供以後使用。

private ArrayList list1; 
private ArrayList list2; 
private static Sistema instance; 
private Sistema() 
{ 
    OpenDataBase(); 
    list1 = LoadStaticInformationFromDataBase(); 
    list2 = LoadOtherStaticInformationFromDataBase(); 
} 

public static Sistema GetInstance() 
{ 
    if (instance == null) 
    { 
     instance = new Sistema(); 
    } 
    return instance; 
} 

在整個一天中,新的對象被添加到每個ArrayList。 在過去的幾天裏,發生了這樣的事情:這些ArrayList中有一個突然變爲null,結果整個站點停止工作。

我一直無法確定爲什麼這會變爲空。

難道ArrayList達到最大值?例如,現在它有超過150.000個對象。

在Global.asax文件中,在Application_Error方法中,我添加了一段存儲在txt文件中的代碼作爲每個錯誤的日誌。但是,那個時候沒有錯誤。

爲什麼會發生這種情況的任何建議?

+0

這是你的實際執行?因爲它不是線程安全的,並且會解釋你的問題。我建議閱讀Jon Skeet的這個頁面:http://csharpindepth.com/Articles/General/Singleton.aspx –

+0

請參閱[本MSDN頁面]上的多線程Singleton部分(http://msdn.microsoft.com/en- us/library/ff650316.aspx) –

+0

@SimonWhitehead嗨西蒙。感謝您及時的回覆。我編輯了我的問題。在構造函數中,加載了多個ArrayList。但是,在某些時候,只有其中一個是空的,所以我想這不是線程的問題。 – Gonzalo

回答

2

只要ASP.NET工作進程處於活動狀態,就存在一個類的靜態字段。一旦ASP.NET工作進程被回收,你將失去所有的靜態數據。

+0

感謝您的快速響應。我不確定是否屬於這種情況,因爲除了ArrayList「list」,我在Singleton構造函數中加載了更多的ArrayList,並且這些都是OK(非空)。此外,會話變量仍然存在。當工作進程被重新編碼時,會話變量也會丟失,對嗎? – Gonzalo

+0

這取決於您使用的會話狀態類型。如果您使用的是SQL Server或會話服務器狀態,那麼它在工作進程之外,並且即使在工作進程死亡後也將存活。 –

+0

感謝您的回答。應用程序池設置爲每天凌晨3點回收。什麼可能會導致這在特定的時間回收?但是,如果進程被回收,每個ArrayList應該爲空,而不僅僅是其中的一個,所以我不確定這是否是原因。 – Gonzalo