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
假设你正确处理所有事情,我有另一种解释:
如果缓存为空/过期且多个页面同时尝试调用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)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |