代码之家  ›  专栏  ›  技术社区  ›  JGilmartin

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

  •  1
  • JGilmartin  · 技术社区  · 15 年前

    我的网站有一个持续的问题,它基本上超时和死亡。我现在已经到了必须设置应用程序池为每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"];
            }
        }
    }
    

    每当我需要成员列表时都会调用这个函数,您可以看到,如果它为空,它将填充缓存(将使用数据库),如果它不为空,那么它将返回缓存对象。我也有sqlcachedDependency,它将清除这些缓存对象,以便再次填充它们。所以这个属性叫做alot。

    现在这是一个Web应用程序,随着我的流量不断增加,

    我的财产会是原因吗?

    任何帮助都是最感激的

    特鲁吉利

    3 回复  |  直到 15 年前
        1
  •  6
  •   Greg    15 年前

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

    如果缓存为空/已过期,并且多个页尝试调用 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;
            }
        }
    }
    
        2
  •  1
  •   Pieter van Ginkel    15 年前

    只有几个常见的嫌疑犯:

    1. 您是否正在处理所有的sqlcommand和读卡器?

    2. 是否正在释放/关闭您的sqlconnection?

    3. 您的数据库能够处理负载吗?你那里有性能问题吗?

    你文章中的代码看起来不像问题所在。

        3
  •  0
  •   Steve Townsend    15 年前

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

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

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