我正在使用 ASP.NET 开发一个 Web 应用程序。我有一个名为“Sistema”的类,它使用单例模式。
创建 Sistema 实例时,会打开数据库连接并运行一个进程,该进程会加载一些静态信息以供以后使用。这持续了将近 2 分钟。
private static Sistema instance;
private Sistema()
{
OpenDataBase();
LoadStaticInformation();
}
public static Sistema GetInstance()
{
if (instance == null)
{
instance = new Sistema();
}
return instance;
}
我保持与数据库的连接打开的原因是因为我使用的是 db4o,这强烈暗示了这一点。以下是一些参考资料:
在我的 Web 应用程序上,我有一个母版页,通过检查 Session 变量来控制用户是否登录。如果此 Session 为空,则将用户发送到登录页面。
在登录页面上,我要做的第一件事是检查“Sistema”的实例是否为空。如果是,那么当用户点击提交按钮时,会显示一条消息,上面写着“登录可能需要最多两分钟。请稍候”。如果它不为空,则不会显示任何消息,因为登录操作只需几秒钟。
用户告诉我,在通过系统时,他们有时会被送回登录页面,当他们尝试登录时,会显示“登录可能需要最多两分钟”的消息,并且确实需要登录一会儿。
它们被发送回登录页面的事实意味着会话变量丢失,并且正在显示的消息意味着“Sistema”的实例也为空。
为了确定发生这种情况的原因,我创建了一个网页,当检测到 Sistema 实例为空时,它会向我发送一封电子邮件。我想如果我能知道这件事发生的时间,我可能会发现发生了什么。
这个网页真的很简单。它每 10 分钟运行一次并检查 Sistema 的实例是否为空。如果是,则发送一封电子邮件并创建 Sistema 实例。
bool isInstanceNull = Sistema.IsInstanceNull();
if (isInstanceNull)
{
String emailTo = "...";
String emailContent = "...";
Functions.SendMail(emailTo, "Sistema is null", emailContent, "");
Sistema.GetInstance();
Functions.SendMail(emailTo, "Sistema has been created", emailContent, "");
}
我发现的唯一一件事是它不是在特定时间发生的。例如,上周发生在晚上 7 点左右,但今天发生在凌晨 2 点。
关于会话超时,我在后面的代码中使用了一个解决方案:http ://www.beansoftware.com/ASP.NET-Tutorials/Keep-Session-Alive.aspx 。
关于为什么会发生这种情况的任何建议?