• 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; }
        }

  • 相关阅读:
    [分治算法]众数问题
    C++代码注入
    003 ansible部署ceph集群
    002 ceph的deploy部署
    001 Ceph简介
    vmware安装ubuntu的简单配置
    博客之行启程
    Java实现 LeetCode 813 最大平均值和的分组 (DFS+DP记忆化搜索)
    Java实现 LeetCode 813 最大平均值和的分组 (DFS+DP记忆化搜索)
    海伦公式和鞋带公式求三角形的面积
  • 原文地址:https://www.cnblogs.com/jinyu20180311/p/10386313.html
Copyright © 2020-2023  润新知