c#常用資料庫封裝再次升級
c#封裝的幾類資料庫操作:
1.sqilte
2.berkeleydb
3.一般資料庫
4.redis
包含其他專案: 1.序列化 2.通訊 3.自定義資料庫連線池
再次升級內容:
1.新增redis客戶端操作(修改)
2.UDP分報組包重發
3.資料庫連線池重構
4.完善了整個框架流程
5.做成了一個完整的結構,但是沒有完整測試,所有模組測試通過
6.新增LRU本地快取,完成整個型別的儲存
7.定義了作為服務的整個結構,傳輸序列化。
8.作為服務端,解決了超時的問題,超時回覆,超時設定。
9.做服務端資料庫操作,添加了datatable轉換Modle型別,可以在客戶端設定;這裡考慮充分利用服務端優勢。
10.增加一個守護程式,該程式沒有用途,只是作為一個服務端的完整性新增的。它的作用就是啟動以後將同目錄的資料庫服務程式幹掉,然後重啟。它什麼時間啟動?就是超時,以前遇到一個問題。國產資料庫使用時間長了,當連線時不返回,會卡死,這樣積累下來,會有很多執行緒卡住,直到整個服務沒有辦法用。當前不是真實專案,所以用了很粗的處理辦法,規定一個最大執行緒和超時,一旦發現阻塞到了最大執行緒,則啟動守護程式,守護程式啟動後將服務幹掉,然後再次啟動服務。然後守護程式自己退出。
說明:如果要轉換,客戶端請求時需要設定ModelCls(Model類),包括名稱空間,如果名稱空間和程式集不同名稱,則還要設定ModelDLL名稱。預設服務端所有Model程式集放置在models目錄中。但是必須遵守格式,為了安全,我定義了一個特性,Model上必須使用特性對映列名稱。可以慢慢研究,歡迎留言。
傳輸請求:
由於定義的連線池支援多個數據庫訪問,只需要根據配置檔名稱(或者預設),你可以訪問任意資料庫;在內部只有名稱。
所以傳輸請求類中也有個欄位DBCfg,名字沒有取號,只有一個數據庫時,不設定則直接訪問預設資料庫,如果多個則必須設定。
TimeOut則是執行超時設定,可以自定義,可以使用服務端預設值,可以用不超時一直執行等待完成。
RequestID:需要客戶端自己產生一個全域性唯一值,這個不重要,只有在客戶端非同步,需要找到你請求的執行時,與返回的結構匹配,能夠讓客戶端自己監視回撥。沒有其他作用。
DBModel專案中還有返回結果,另外封裝了列舉型別的擴充套件方法,還有引數化SQL的設定物件。
整個流程說明:
其實整個傳圍繞傳輸型別DBTransfer來的,在DBModel專案中,模板的化的回覆結構也在改專案中。後面附上改類定義,另外需要設定型別,後面也會設定。
至此,整個包括了SQL資料庫(連線池任意配置),本地KV資料庫(berkeleydb),本地SQL資料庫(Sqlite),記憶體SQL資料庫(Sqlite),記憶體NOSQL資料庫(redis),記憶體KV儲存(LRU快取)
程式碼附加:
public enum DBServerType
{
[Description("關係資料庫")]
ServerSQL,
[Description("本地SQL資料庫")]
LocalSQL,
[Description("記憶體SQL資料庫")]
MemorySQL,
[Description("記憶體NoSQL資料庫")]
MemoryNoSQL,
[Description("本地KV資料庫")]
LocalKV,
[Description("其它資料庫,redis,mongdb等")]
NoSQL
}
/// <summary>
/// 傳輸請求
/// </summary>
public class DBTransfer
{
public DBTransfer()
{
TimeOut = -1;
}
/// <summary>
/// SQL語句
/// </summary>
public string SQL { get; set; }
/// <summary>
/// SQL引數
/// </summary>
public Dictionary<string,DBParameter> SQLParamter { get; set; }
/// <summary>
/// 資料庫型別
/// </summary>
public DBServerType DBServerType { get; set; }
/// <summary>
/// 是否是查詢SQL
/// </summary>
public bool IsQuery { get; set; }
/// <summary>
/// 執行SQL是否是獲取單值
/// </summary>
public bool IsScala { get; set; }
/// <summary>
/// 查詢時是否轉換成Model
/// </summary>
public bool IsModel { get; set; }
/// <summary>
/// IsModel=true,轉換的model名稱(包括名稱空間)
/// </summary>
public string ModelCls { get; set; }
/// <summary>
/// 需要單獨設定時,否則直接使用空間名稱相同dll
///
/// </summary>
public string ModelDLL { get; set; }
/// <summary>
/// NoSQL引數
/// </summary>
public Dictionary<object,object> Paramter { get; set; }
/// <summary>
/// 資料庫名稱或者配置名稱(SQL)
/// </summary>
public string DBCfg { get; set; }
/// <summary>
/// 請求ID,用於辨別返回請求
/// 將會與返回對應,處理客戶端的非同步
/// </summary>
public long RequestID { get; set; }
/// <summary>
/// 執行超時,不是網路超時(秒)
///-1,採用服務端設定 0,此次執行用不超時,大於0則超時時間
///預設-1
/// </summary>
public int TimeOut { get; set; }
}
-------------------------------------------------------------
/// <summary>
/// 返回結果
/// </summary>
public class RequestResult
{
/// <summary>
/// 返回值
/// </summary>
public object Result { get; set; }
/// <summary>
/// 結果編碼
/// </summary>
public ErrorCode Error { get; set; }
/// <summary>
/// 結果編碼描述
/// </summary>
public string ErrorMsg { get; set; }
/// <summary>
/// 結果附近資訊
/// 主要是異常資訊或者其它描述
/// 例如:結果被擷取
/// </summary>
public string ReslutMsg { get; set; }
/// <summary>
/// 服務端分配的一個ID
/// </summary>
public long ID { get; set; }
/// <summary>
/// 客戶端的ID
/// </summary>
public long RequestID { get; set; }
}
---------------------
作者:jason成都
來源:CSDN
原文:https://blog.csdn.net/jinyuttt/article/details/84840361
版權宣告:本文為博主原創文章,轉載請附上博文連結!