C# 这个代码会杀死我的服务器吗?
我有一个持续的问题,我的网站,它基本上超时和死亡。我现在已经到了必须将应用程序池设置为每5分钟自动回收一次的地步,但即使这样也失败了,因为我刚下班回来,我的电子邮件收件箱里满是4000封电子邮件,都有相同的错误 System.Data.SqlClient.SqlException:超时已过期。操作完成前已过超时时间,或者服务器没有响应 今天早上我尝试了一个测试,在那里我禁用了连接字符串上的池,这也不起作用 现在我在想,也许这不是泄漏连接的问题,我以前也经历过这些,我认为这可能与我的站点的核心静态属性有关 这是其中之一C# 这个代码会杀死我的服务器吗?,c#,performance,properties,timeout,thread-safety,C#,Performance,Properties,Timeout,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"];
}
}
}
公共静态列表所有成员
{
得到
{
if(HttpRuntime.Cache[“Members”!=null)
{
返回(列表)HttpRuntime.Cache[“成员”];
}
其他的
{
GetAllMembers();
返回(列表)HttpRuntime.Cache[“成员”];
}
}
}
每当我需要一个成员列表时,就会调用它,您可以看到,如果它为null,它将填充缓存,缓存将使用数据库,如果它不为null,它将返回缓存对象。我也有SqlCacheDependence,它将清除这些缓存对象,以便再次填充它们。所以这个属性被称为ALOT
现在这是一个web应用程序,由于我的流量一直在增加
我的财产可能是原因吗
非常感谢您的帮助
Truegilly只是几个常见的嫌疑犯:
您帖子中的代码看起来不是问题所在。只是一些常见的疑点:
您帖子中的代码看起来不是问题所在。假设您正确处理了所有内容,我有另一种解释: 如果缓存为空/已过期,且多个页面试图同时调用
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上发生的情况?霍