2012-12-12 34 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