Visual studio 2005 緩存技術助E8.Net工作流2008 經歷巨大處理能力挑戰。
回顧E8.Net工作流的發展歷程,2004-2005年經歷了某省郵政局全體管理人員使用的辦公自動化系統考驗後,E8的處理能力提到過非常大的提升,之後幾十個200-2000之間用戶數的系統,日處理流程實例數在100 -400之間的系統基本上性能體驗很流暢,2006年底某市郵政局185綜合服務系統采用E8.Net工作流系統處理EMS攬收、電子商務、通行證簽注、淘寶網物流配送。。。。剛開始的時候40個台席,日均處理流程數量是700左右。 隨著業務的擴展及應用模式的成熟,到2007年年底時已經達到200個台席,B/S架構系統日均處理流程數量達12000單每日。這個過程也是E8.Net工作流2008版本的成長過程。其中Visual studio 2005中的SQL 緩存依賴技術是E8工作流經歷這種挑戰用到的比較重要的技術之一。
大家知道CACHE技術是.Net中一個非常有價值的技術,。NET2。0支持SqlCacheDependency ,可以使CACHE依賴數據庫表的變化而失效,保證獲取最有效的數據,但可以減少數據庫CPU壓力。E8中用到的相關技術總結一下與大家分享。
優化思路回顧:
1、將操作調用頻繁,數據很少變化,實時性要求不嚴格的數據庫相關操作改為內存數據庫處理模式操作,利用CACHE技術和 SqlCacheDependency 技術。構造相關數據的內存數據模型。提高計算效率並減少數據庫處理壓力。
2、調整流程模型數據、組織結構數據變化更新少數幾個數據表,使SqlCacheDependency CACHE依賴的表比較集中,保證CACHE緩存檢測的效率
3、為內存數據提供強制失效的處理接口,保證相關數據變化後,重新加載內存數據
。。。。。。
范例代碼:
string Key = "xxxxxxCache_" + CacheName.ToLower();
string strSQL = "";
bool blnConstraint = false; //為SQL緩存依賴添加 強制取消的功能
if (sCacheSource == string.Empty)
{
sCacheSource = System.Configuration.ConfigurationSettings.APPSettings["SqlCacheDataSource"];
}
DataTable dt = null;
SqlCacheDependency scd;
//判斷SQL緩存依賴添加 強制取消
// 通過外部程序相關 cache 賦值的方式 switch (CacheName.ToLower())
case "app":
break;
case "masteruserdept":
..
case "user":
..
break;
case "dept":
//判斷dept變化
.
break;
case "actorcond":
case "flowmodelall":
case "flowmodelnodesall":
case "flowmodel":
case "flowmodelnodes":
//判斷FLOWMODEL變化
.
break;
default:
break;
}
if (HttpRuntime.Cache[Key] == null)
{
//取數據
try
{
switch (CacheName.ToLower())
{
case "app":
strSQL = "SELECT * FROM xxxxx ";
dt = MyDataBase.QueryDataTableByStr(strSQL);
scd = new SqlCacheDependency(sCacheSource, "es_app");
HttpRuntime.Cache.Insert(Key, dt, scd);
break;
case "user":
//必須考慮歷史情況
strSQL = "SELECT * FROM xxxxx ";
dt = MyDataBase.QueryDataTableByStr(strSQL);
scd = new SqlCacheDependency(sCacheSource, "ts_user");
HttpRuntime.Cache.Insert(Key, dt, scd);
break;
case "dept":
//必須考慮歷史情況
strSQL = "SELECT * FROM xxxx";
dt = MyDataBase.QueryDataTableByStr(strSQL);
scd = new SqlCacheDependency(sCacheSource, "ts_dept");
HttpRuntime.Cache.Insert(Key, dt, scd);
break;
case "masteruserdept":
.
break;
case "flowmodelnodes":
. break;
case "flowmodelall":
.
break;
default:
break;
}
}
catch(Exception e)
{
dt = null;
//如果有錯誤發生配置一下 SQL 緩存
}
}
else
{
//從緩存中取值
dt= (DataTable)HttpRuntime.Cache[Key];
}
return dt;
在這裡感謝客戶提供的思路。