在代码中使用缓存可以减少对数据库的访问,减少数据库的压力,在高并发的情况下效果特别明显。
public string GetWaitInfo(int corpId, int plantformId)
{
SCommBB commBB = new SCommBB();
try
{
//查询sql
string startDt = DateTime.Now.ToString("yyyy-MM-dd");
string endDt = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd");
string waitSql = @"SELECT COUNT(1) AS waitAmount,corpId
FROM AP_VC_VaccineInoculateCall a with(nolock)
INNER JOIN AP_VC_VaccineInoculateRegister b with(nolock) ON a.vaccineInoculateRegisterId=b.id
WHERE a.isEnd=0 AND a.isSkip=0 AND b.registerDt>='{0}'
group by corpId";
waitSql = string.Format(waitSql, startDt, plantformId);
DataTable WaitDT = new DataTable();
if (HttpRuntime.Cache["GetIceBoxGetWaitInfo_Time"] != null && HttpRuntime.Cache["GetIceBoxGetWaitInfo"] != null)
{
//五秒才查一次,否则从缓存里面查
if ((DateTime.Now - Convert.ToDateTime(HttpRuntime.Cache["GetIceBoxGetWaitInfo_Time"])).TotalSeconds >= 5
&& Monitor.TryEnter(HttpRuntime.Cache["GetIceBoxGetWaitInfo_Time"])
&& Monitor.TryEnter(HttpRuntime.Cache["GetIceBoxGetWaitInfo"]))
{
WaitDT = commBB.Query(waitSql).Tables[0];
HttpRuntime.Cache["GetIceBoxGetWaitInfo"] = WaitDT;
HttpRuntime.Cache["GetIceBoxGetWaitInfo_Time"] = DateTime.Now;
//LogManager.WriteLog("aaaa", "更新缓存");
}
else
{
WaitDT = HttpRuntime.Cache["GetIceBoxGetWaitInfo"] as DataTable;
}
}
else
{
WaitDT = commBB.Query(waitSql).Tables[0];
HttpRuntime.Cache["GetIceBoxGetWaitInfo"] = WaitDT;
HttpRuntime.Cache["GetIceBoxGetWaitInfo_Time"] = DateTime.Now;
//LogManager.WriteLog("aaaa", "初始化");
}
string rst = "";
if (WaitDT.Rows.Count == 0)
{
rst = "0";
}
else
{
//先将dt中的数据按照条件查出来()
DataRow[] drs = WaitDT.Select("corpId =" + corpId);
//必须要重新new一个dt来赋值,参照下面代码,否则会报错!!!
DataTable newDt = WaitDT.Clone(); //克隆结构
//如果不需要克隆整个dt,则需要重新new一个dt,然后添加列,参照下面两行
//DataTable newDt = new DataTable(); //dtRegister.Clone(); //克隆结构
//newDt.Columns.Add("content", Type.GetType("System.String"));
drs.ToList<DataRow>().ForEach((r) => newDt.ImportRow(r));
if (newDt.Rows.Count > 0)
{
rst = newDt.Rows[0]["waitAmount"].ToString();
}
else
{
rst = "0";
}
}
return rst;
}
catch (Exception ex)
{
return "0";
}
finally
{
commBB.Dispose();
}
}