在前面的WinForm篇前面我用了四篇文章執行個體示範了一個基于AgileEAS.NET實作兩個應用子產品:商品字典的管理和商品入庫子產品,這兩個子產品是一個典型的進銷存系統中的兩個經典而必須存在的兩個子產品。
1.結合緩存技術一文,在今天的本例中,實作了個極其簡單的ICacheManager,其提供了基于Key-Value的對象緩存,隻提供了最基本的緩存處理,不提供緩存技術中的同步寫回機制,也不提供緩存技術中的命中也緩存淘汰機制,關于這些内容有興趣的朋友可以找我私下交流。
2.結合案例我詳細的介紹AgileEAS.NET平台中的ORM緩存查詢的詳細使用方法。
3.基于應用案例讨論緩存的典型應用場景,進而了解性能優化的一些原則和基本發點。
我們來動手實作一個最簡單的ICacheManager,在Product解決方案之中增加了一個Product.Cache項目,增加ICacheManager接口和一個簡單的實作CacheManager,代碼如下:
1 public class CacheManager : ICacheManager
2 {
3 Dictionary<string, object> objectList = new Dictionary<string, object>();
4
5 #region ICacheManager 成員
6
7 public void Set(string key, object value)
8 {
9 this.objectList.Add(key, value);
10 }
11
12
13 public object Get(string key)
14 {
15 if (this.Exist(key))
16 return this.objectList[key];
17 else
18 return null;
19 }
20
21 public bool Exist(string key)
22 {
23 return this.objectList.ContainsKey(key);
24 }
25
26 public void Remove(string key)
27 {
28 if (this.Exist(key))
29 this.objectList.Remove(key);
30 }
31
32 public void Clear()
33 {
34 this.Clear();
35 }
36
37 #endregion
38 }
這個ICacheManager實作隻提供最簡單的Key-Value,提供最基本的緩存服務,緩存對象與取緩存,而不提供命中、淘汰、同步與寫回技術。
本文的緩存查詢優化場景是這樣的,前面案例中在商品入庫的過程中,系統根據操作員輸入的拼音簡碼檢索資料庫,在産品字典輸入選擇界面中當檢查輸入的條件發生變動時就去通路資料庫,這樣呢會頻繁的通路資料庫,如果有大量的客戶短使用資料庫,那麼因為頻繁的資料庫查詢會嚴重的影響資料庫伺服器的性能,而我們今天改造這個案例達到什麼目的呢,第一次使用系統時,客戶段會把商品字典記錄一次性取回來,緩存在緩存系統之中,而在其後的拼音碼檢索中,不再通路資料庫,而是直接使用緩存中的字典記錄執行緩存查詢,為了這個場景的友善展示我做了一個簡單的視訊,我把視訊簡單的分為不使用緩存系統與使用緩存系統,并且在示範的過程中打開SQLServer的事件探查器進行對比:
從視訊中我們可以看了使用緩存與緩存查詢性能帶來的提省,極大的減少了資料庫伺服器的SQL查詢請求。
在視訊中,我也簡單的給大家看了一個程式代碼,在這次的代碼之中,增加了一個Product.Cache,用于定義和實作了一個簡單的緩存系統,在Product.UI中增加了一個關于緩存上下文的輔助類CacheContext,其他最主要是提供了商品字典的緩存處理,代碼如下:
1 static class CacheContext
3 /// <summary>
4 /// Orm通路器。
5 /// </summary>
6 public static ICacheManager CacheManager
7 {
8 get
9 {
10 return ContextHelper.GetContext().Container.GetComponentInstance("CacheManager") as ICacheManager;
11 }
12 }
13
14 /// <summary>
15 /// 處理産品字典緩存。
16 /// </summary>
17 /// <returns></returns>
18 public static IProductList GetProductListCache()
19 {
20 string key = "ProductList";
21 if(!CacheManager.Exist(key))
22 {
23 IProductList table = DALHelper.DALManager.CreateProductList();
24 table.Query();
25 CacheManager.Set(key, table);
26 }
27
28 return CacheManager.Get(key) as IProductList;
29 }
30 }
在這裡面,使用了IOC方面的知識,在此我就不詳細的再給大家了解,大家可以參考前面的文章了解和學習配置,在使用ORM的緩存查詢時,需要在系統配置檔案的IOC配置資訊中配置緩存查詢通路器的資訊:
配置檔案
1 <?xml version="1.0" encoding="utf-8"?>
2 <configuration>
3 <configSections>
4 <section name="EAS.Objects" type="EAS.Objects.ConfigHandler,EAS.IOCContainer"/>
5 </configSections>
6 <EAS.Objects>
7 <object name="DataConnection" assembly="EAS.Data" type="EAS.Data.Access.SqlClientConnection" LifestyleType="Thread">
8 <property name="ConnectionString" type="string" value="Data Source=vm2003;Initial Catalog=eas;User ID=sa" />
9 </object>
10 <object name="OrmAccessor" assembly="EAS.Data" type="EAS.Data.ORM.OrmAccessor" LifestyleType="Thread">
11 <property name="DbConnection" type="object" value="DataConnection" />
12 </object>
13 <object name="DataAccessor" assembly="EAS.Data" type="EAS.Data.Access.SqlClientAccessor" LifestyleType="Thread">
14 <property name="Connection" type="object" value="DataConnection" />
15 </object>
16
17 <!--
18 緩存查詢元件。
19 -->
20 <object name="CacheAccessor" assembly="EAS.Data" type="EAS.Data.ORM.CacheAccessor" LifestyleType="Thread"/>
21
22 <!--
23 緩存管理元件。
24 -->
25 <object name="CacheManager" type="Product.Cache.CacheManager,Product.Cache" LifestyleType="Singleton"/>
26
27 <object name="Product.DAL" assembly="Product.DAL.SQLServer" type="Product.DAL.SQLServer.DALManager" LifestyleType="Singleton"/>
28 </EAS.Objects>
29 </configuration>
在現階段的AgileEAS.NET平台中,内置了一個緩存查詢通路器實作EAS.Data.ORM.CacheAccessor,大家可以在應用中直接使用上面的配置,當然了,不安排除在後面提供其他緩存查詢通路器,敬請大家期待。
本文今天就到這兒,對這東西感興趣的朋友呢,可以下載下傳了完整代碼之後自己看看,有問題請及時的和我聯系。
連結
<a href="http://www.cnblogs.com/eastjade/archive/2010/09/19/1830812.html">一步一步教你使用AgileEAS.NET基礎類庫進行應用開發-系列目錄</a>
<a href="http://www.cnblogs.com/eastjade/archive/2010/09/12/1824405.html">AgileEAS.NET平台開發指南-系列目錄</a>
<a href="http://www.cnblogs.com/eastjade/archive/2010/09/09/1822530.html">AgileEAS.NET應用開發平台介紹-文章索引</a>
<a href="http://www.cnblogs.com/eastjade/archive/2010/09/15/1826870.html">AgileEAS.NET平台應用開發教程-案例計劃</a>
<a href="http://www.smarteas.net/">AgileEAS.NET官方網站</a>
<a href="http://www.agilelab.cn/">靈活軟體工程實驗室</a>
QQ群:116773358