C# 这个代码会杀死我的服务器吗?

C# 这个代码会杀死我的服务器吗?,c#,performance,properties,timeout,thread-safety,C#,Performance,Properties,Timeout,Thread Safety,我有一个持续的问题,我的网站,它基本上超时和死亡。我现在已经到了必须将应用程序池设置为每5分钟自动回收一次的地步,但即使这样也失败了,因为我刚下班回来,我的电子邮件收件箱里满是4000封电子邮件,都有相同的错误 System.Data.SqlClient.SqlException:超时已过期。操作完成前已过超时时间,或者服务器没有响应 今天早上我尝试了一个测试,在那里我禁用了连接字符串上的池,这也不起作用 现在我在想,也许这不是泄漏连接的问题,我以前也经历过这些,我认为这可能与我的站点的核心静态

我有一个持续的问题,我的网站,它基本上超时和死亡。我现在已经到了必须将应用程序池设置为每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"];
        }
    }
}
公共静态列表所有成员
{
得到
{
if(HttpRuntime.Cache[“Members”!=null)
{
返回(列表)HttpRuntime.Cache[“成员”];
}
其他的
{
GetAllMembers();
返回(列表)HttpRuntime.Cache[“成员”];
}
}
}
每当我需要一个成员列表时,就会调用它,您可以看到,如果它为null,它将填充缓存,缓存将使用数据库,如果它不为null,它将返回缓存对象。我也有SqlCacheDependence,它将清除这些缓存对象,以便再次填充它们。所以这个属性被称为ALOT

现在这是一个web应用程序,由于我的流量一直在增加

我的财产可能是原因吗

非常感谢您的帮助


Truegilly

只是几个常见的嫌疑犯:

  • 是否正在处理所有SqlCommand和读卡器

  • 您正在处理/关闭您的SqlConnection吗

  • 您的数据库能够处理负载吗?您在那里有性能问题吗


  • 您帖子中的代码看起来不是问题所在。

    只是一些常见的疑点:

  • 是否正在处理所有SqlCommand和读卡器

  • 您正在处理/关闭您的SqlConnection吗

  • 您的数据库能够处理负载吗?您在那里有性能问题吗


  • 您帖子中的代码看起来不是问题所在。

    假设您正确处理了所有内容,我有另一种解释:

    如果缓存为空/已过期,且多个页面试图同时调用
    AllMembers
    ,则每个页面可能会同时调用
    GetAllMembers()
    ,从而减慢数据库查询速度。如果通话开始超时,这可能会引发恶性循环

    您可以在代码周围放置一个
    ,这样每个属性只能进行一次数据库查询。以下是我可以如何设置它:

    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;
            }
        }
    }
    
    private static object\u allMembersLock=new object();
    公共静态列表所有成员
    {
    得到
    {
    锁定(所有成员锁定)
    {
    List members=(List)HttpRuntime.Cache[“members”];
    如果(成员==null)
    {
    members=GetAllMembers();
    HttpRuntime.Cache[“Members”]=成员;
    }
    返回成员;
    }
    }
    }
    
    假设您正确处理了所有东西,我有另一种解释:

    如果缓存为空/已过期,且多个页面试图同时调用
    AllMembers
    ,则每个页面可能会同时调用
    GetAllMembers()
    ,从而减慢数据库查询速度。如果通话开始超时,这可能会引发恶性循环

    您可以在代码周围放置一个
    ,这样每个属性只能进行一次数据库查询。以下是我可以如何设置它:

    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;
            }
        }
    }
    
    private static object\u allMembersLock=new object();
    公共静态列表所有成员
    {
    得到
    {
    锁定(所有成员锁定)
    {
    List members=(List)HttpRuntime.Cache[“members”];
    如果(成员==null)
    {
    members=GetAllMembers();
    HttpRuntime.Cache[“Members”]=成员;
    }
    返回成员;
    }
    }
    }
    
    我在这里看不到任何防止对getter的多个并发调用触发
    GetAllMembers
    的保护。当然,一次只需要一个线程来加载属性。似乎需要某种类型的
    lock()

    您应该确保刷新缓存的代码也使用相同的
    lock()


    如果可以从多个服务器调用此代码,则还需要确保任何数据库端程序逻辑(存储过程或客户端的动态SQL)这是高效、正确地处理多个并发读卡器的基础。

    我看不到任何保护措施可以防止对getter的多个并发调用触发
    GetAllMembers
    。当然,一次只需要一个线程来加载属性。似乎需要某种类型的
    lock()

    您应该确保刷新缓存的代码也使用相同的
    lock()


    如果可以从多台服务器调用此代码,则还需要确保支持
    GetAllMembers
    的任何数据库端程序逻辑(存储过程或客户端的动态SQL)都能高效、正确地处理多个并发读卡器。

    查看GetAllMembers()的代码更有用你有没有试着在压力下监控应用程序的内存使用情况?您是否检查并监视MS SQL上发生的情况?您如何诊断问题所在?或者你只是想猜测问题可能出在哪里?查看GetAllMembers()的代码比查看属性更有用吗?你是否试图在压力下监控应用程序的内存使用情况?您是否检查并监视MS SQL上发生的情况?霍