我們掛在嘴過的一句話就是“static是靜態對象,在類第一次被使用,或者第一次被實例化時執行“,但是你是否真正理解這句話,或者說
你是否有對這句話進行一個實際的驗證,如果沒有,那我來帶您完成這次旅行吧!
首先有一張表,不會經常發生變化,比如分類表,他是一種樹型結構表,結構可能是這樣
1 /// <summary> 2 /// 分類表 3 /// </summary> 4 public partial class Common_Category : IDataEntity 5 { 6 //初始字段 7 #region original field 8 9 /// <summary> 10 /// ID 11 /// </summary> 12 public Int32 ID { get; set; } 13 14 /// <summary> 15 /// 上級ID 16 /// </summary> 17 public Int32 ParentID { get; set; } 18 19 20 /// <summary> 21 /// 名稱 22 /// </summary> 23 public String Name { get; set; }
首先,它在程序中會經常被調用,也就是說,會經常訪問這張數據表,由於它的內容基本不變,所以,我想到了static對象,下面我用static對象來完成這個需求
1 /// <summary> 2 /// 得到靜態對象(一般表數據不發生變) 3 /// </summary> 4 /// <returns></returns> 5 public static IList<Common_Category> GetCommon_CategoryModel 6 { 7 get 8 { 9 return new LinqDBDataContext().Common_Category.ToList(); 10 } 11 }
這樣,可以完成我們的需求,這種設計在單機調試時沒有任何問題,但發布后,在IIS里訪問時,它的對象雖然創建了一次,但沒是刷新一次
就連接一次數據庫,沒有解決我們的問題,之后,有了新的想法:
單件,對單件模式,每個對象有且只有一個實例出現,有兩個方式的單件,線程安全的和不安全的,呵呵,都拿出來看看:
1 /// <summary> 2 /// 線程安全的單件模式 3 /// </summary> 4 public sealed class StaticCustomer 5 { 6 private static volatile IList<Customer> instance = null; 7 // Lock對象,線程安全所用 8 private static object syncRoot = new Object(); 9 10 private StaticCustomer() { } 11 12 public static IList<Customer> Instance 13 { 14 get 15 { 16 if (instance == null) 17 { 18 lock (syncRoot) 19 { 20 if (instance == null) 21 instance = new LinqDBDataContext().Customer.ToList(); 22 } 23 } 24 25 return instance; 26 } 27 } 28 } 29 30 /// <summary> 31 /// 簡單的模式,沒有考慮線程問題 32 /// </summary> 33 public sealed class SingtonCustomer 34 { 35 private static IList<Customer> instance = null; 36 private SingtonCustomer() { } 37 public static IList<Customer> Instance 38 { 39 get 40 { 41 if (instance == null) 42 { 43 instance = new LinqDBDataContext().Customer.ToList(); 44 } 45 return instance; 46 } 47 } 48 }
建議使用線程安全的單件,通過測試,沒有問題。