这段代码会杀了我的服务器吗?

JGi*_*tin 1 c# performance timeout properties thread-safety

我的网站一直存在问题,它基本上超时而且已经死亡.我现在已经到了这一点,我必须将应用程序池设置为每5分钟自动回收一次,但即使这样也失败了,因为我刚从工作中回来,我的电子邮件收件箱中有4000封电子邮件全部都是相同的错误.

System.Data.SqlClient.SqlException:超时已过期.操作完成之前经过的超时时间或服务器没有响应.

今天早上我尝试了一个测试,我在连接字符串上禁用了池,这也没有用.

现在我想,也许这不是泄漏连接的问题,我以前经历过这一切,我认为这可能与我的网站核心的静态属性有关

这是其中之一

public static List<Member> AllMembers
{
    get
    {
        if (HttpRuntime.Cache["Members"] != null)
        {
            return (List<Member>)HttpRuntime.Cache["Members"];
        }
        else
        {
            GetAllMembers();
            return (List<Member>)HttpRuntime.Cache["Members"];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每当我想要一个成员列表时就会调用它,你可以看到,如果它为null,它会填充缓存,它将使用数据库,如果它不为null,那么它将返回缓存对象.我也有SQLCacheDependancy,它将清除这些缓存对象,因此它将再次填充它们.所以这个属性叫做ALOT.

现在这是一个Web应用程序,因为我的流量一直在增加其染色,

我的房产可能是原因吗?

任何帮助都非常感谢

Truegilly

Gre*_*reg 6

假设你正确处理所有事情,我有另一种解释:

如果缓存为空/过期且多个页面同时尝试调用AllMembers,则每个页面可能最终GetAllMembers()同时调用,从而减慢数据库查询速度.如果呼叫开始超时,这可能会开始恶性循环.

您可以放置lock代码,因此每个属性只能进行一次数据库查询.以下是我如何设置它:

private static object _allMembersLock = new object();
public static List<Member> AllMembers
{
    get
    {
        lock (_allMembersLock)
        {
            List<Member> members = (List<Member>)HttpRuntime.Cache["Members"];
            if (members == null)
            {
                members = GetAllMembers();
                HttpRuntime.Cache["Members"] = members;
            }
            return members;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)