在系統設計中,經常會使用「池」的概念。比如資料庫連線池,socket連線池,執行緒池,元件佇列。「池」可以節省物件重複建立和初始化所耗費 的時間,可以簡化物件獲取和使用的過程。對於那些被系統頻繁請求和使用的物件,如果使用這種機制,可以使系統效能得到很大提高。特別象資料庫連線這種對 象,客戶端與資料庫伺服器端建立連線時,是比較慢的,如果每次進行資料庫操作,都要先進行資料庫連線,系統效率將非常低下。
「池」的概念就是將被使用的物件事先建立好,儲存在列表中,供客戶端取用。當客戶端取得乙個物件時,這個物件就已經是按照特定上下文環境初始化好,馬上即 可使用的了。當客戶端使用完畢,需要將物件歸還給「池」,最後,在系統生命期結束時,由「池」統一釋放這些物件。從另乙個概念上來說,這也是一種「以空間 換時間」的做法,我們在記憶體中儲存一系列整裝待命的物件,供人隨時差遣。與系統效率相比,這些物件所占用的記憶體空間太微不足道了。
「池」的結構是通用的,就是不管他裡面儲存的是哪一種物件,他的工作方法都基本不變。無非是初始化一系列物件,然後提供乙個獲取可用物件,乙個歸還物件的介面。
//// 物件池
////
using system;
using system.collections.generic;
using system.text;
using system.timers;
using system.collections;
namespace objectpool
/// /// 建立乙個新的物件
///
/// 物件例項
protected abstract t create();
/// /// 檢查特定物件有效性
///
/// 物件例項
/// 是否有效 true or false
protected abstract bool validate(t t);
/// /// 刪除物件
///
/// 物件例項
protected abstract void expire(t t);
/// /// 建構函式
///
internal objectpool()}}
catch (exception)}};
}/// /// 從池中獲取物件
///
/// 物件例項
internal t getobjectfrompool()
else}}
catch (exception)
// 新建立物件
t = create();
// 設定為正在使用物件
objlocked.add(t, longnow);
}return t;
}/// /// 將物件放入池中
///
/// 物件例項
internal void returnobjecttopool(t t)}}
}}
dbconn類:
using system;using system.collections.generic;
using system.text;
using system.data;
using system.data.sqlclient;
namespace objectpool
/// /// 返回自身物件(singleton)
///
public static readonly dbconn instance = new dbconn();
/// /// 預設連線語句
///
private static string strconnstr = @"data source=work0249\;initial catalog=adventureworks;persist security info=true;user id=sa;password=sa";
/// /// 連線語句(屬性)
///
public string strconnstr
set}
/// /// 建立資料庫連線物件
///
/// 已開啟的資料庫連線物件
protected override sqlconnection create()
/// /// 驗證連線狀態
///
/// 資料庫連線物件
/// 連線狀態open : true close:false
protected override bool validate(sqlconnection t)
catch (sqlexception)
}/// /// 關閉資料庫連線
///
/// 資料庫連線物件
protected override void expire(sqlconnection t)
catch (sqlexception)
}/// /// 從池中獲取資料庫連線
///
/// 資料庫連線物件
public sqlconnection borrowdbconn()
catch (exception ex)
}/// /// 將連線物件放入池中
///
/// 資料庫連線物件
public void returndbconn(sqlconnection conn)
}}
使用示例:
using system;using system.collections.generic;
using system.text;
using system.data.sqlclient;
namespace objectpool
// 將物件放入池中
dbconn.returndbconn(conn);
console.read();}}
}
物件池化技術
物件池化技術 物件池化的基本思路是 將用過的物件儲存起來,等下一次需要這種物件的時候,再拿出來重複使用,從而在一定程度上減少頻繁建立物件所造成的開銷。用於充當儲存物件的 容器 的物件,被稱為 物件池 object pool,或簡稱pool 對於沒有狀態的物件 例如string 在重複使用之前,無需進...
池化技術 執行緒池
執行緒池 任務 等待任務 全域性的任務佇列queue無任務且無銷毀,任務新增函式 等待add的signal 載入任務 add將新建任務指標task賦予queue 執行任務 執行緒池內任一rtn獲取當前佇列的頭 第乙個任務task 執行,並將此任務從佇列中剔除 退出執行緒池內某一rtn 根據實際的程式...
物件記憶體池技術
所謂的物件記憶體池技術設計過程如下 首先為某種物件預先生成若干個空閒物件 並且使用物件管理類進行管理。應用程式在需要使用此物件時,即向管理物件申請空閒物件.管理物件即檢視物件記憶體池,如果發現存在未使用空閒物件,即分配給申請者。如果發現已無空閒物件,可自行擴充物件記憶體池,並且滿足申請物件的需求,也...