物件池化技術相關

2022-03-05 19:16:28 字數 2990 閱讀 8150

在系統設計中,經常會使用「池」的概念。比如資料庫連線池,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 根據實際的程式...

物件記憶體池技術

所謂的物件記憶體池技術設計過程如下 首先為某種物件預先生成若干個空閒物件 並且使用物件管理類進行管理。應用程式在需要使用此物件時,即向管理物件申請空閒物件.管理物件即檢視物件記憶體池,如果發現存在未使用空閒物件,即分配給申請者。如果發現已無空閒物件,可自行擴充物件記憶體池,並且滿足申請物件的需求,也...