1. 程式人生 > >c#常用資料庫封裝再次升級

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
版權宣告:本文為博主原創文章,轉載請附上博文連結!