1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
      <output id="hzk7v"></output>
    2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
    3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

      .NET Core实现分表分库¡¢读写分离的通用 Repository功能

       更新时间£º2019年04月03日 15:42:45   作者£ºdotnetGen   我要评论

      这篇文章主要介绍了.NETCore 下支持分表分库¡¢读写分离的通用 Repository£¬文中通过示例代码介绍的非常详细£¬对大家的学习或者工作具有一定的参考学习价值£¬需要的朋友们下面随着小编来一起学习学习吧

      首先声明这篇文章不是标题?#24120;?#25105;说的这个类库是 FreeSql.Repository£¬它作为扩展库现实了通用仓储层功能£¬接口规范参考 abp vnext 定义£¬实现了基础的仓储层£¨CURD£©¡£

      安装

      dotnet add package FreeSql.Repository

      可用于£º.net framework 4.6+¡¢.net core 2.1+

      定义
      var fsql = new FreeSql.FreeSqlBuilder()
       .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10")
       .UseLogger(loggerFactory.CreateLogger<IFreeSql>())
       .UseAutoSyncStructure(true) //自动迁移实体的结构到数据库
       .Build();

      过滤与验证

      假设我们有User(用户)¡¢Topic(主题)两个实体£¬在某领域类中定义了两个仓储£º

      var userRepository = fsql.GetGuidRepository<User>();
      var topicRepository = fsql.GetGuidRepository<Topic>();

      开发过程中£¬我总会担心 topicRepository 的数据安全问题£¬即有可能查询或操作到其他用户的主题¡£因此在v0.0.7版本进行了改进£¬增加了 filter lambad 表达式参数¡£

      var userRepository = fsql.GetGuidRepository<User>(a => a.Id == 1);
      var topicRepository = fsql.GetGuidRepository<Topic>(a => a.UserId == 1);
      • 在查询/修改/删除?#22791;?#21152;此条件£¬从而达到不会修改其他用户的数据£»
      • 在添加时£¬使用表达式验证数据的合法性£¬若不合法则抛出异常£»

      有朋友说这个功能像 abp 的租户£¬但这是更小单位的过滤+验证£¬确保数据安全¡£
      有朋友说这个功能省事£¬但我觉得是省心¡£

      分表与分库

      GuidRepository 作为分存式仓储将实现了分表与分库£¨不支持跨服务器分库£©的封装类¡£

      var logRepository = fsql.GetGuidRepository<Log>(null, oldname => $"{oldname}_{DateTime.Now.ToString("YYYYMM")}");

      上面我们得到一个日志仓储实例按年月分表£¬使用它 CURD 最终会操作 Log_201903 表¡£

      注意£º虽然 FreeSql 支持 CodeFirst 迁移£¬但不提供迁移分表£¬开发环?#25345;?#20173;然可以迁移 Log 表¡£

      读写分离

      FreeSql 支持数据库读写分离£¬本功能是客户端的读写分离行为£¬数据库服务器该怎么配置仍然那样配置£¬不受本功能影响£¬为了方便描术后面讲到的¡¾读写分离¡¿都是指客户端的功能支持¡£

      各种数据库的读写方案不一£¬数据库端开启读写分离功能后£¬读写分离的实现大致分为以下几种£º

      1¡¢nginx代理£¬配置繁琐且容易出错£»

      2¡¢中件间£¬如MySql可以使用MyCat£¬但是其他数据库怎么办£¿

      3¡¢在client端支持£»

      FreeSql 实现了第3种方案£¬支持一个¡¾主库¡¿多个¡¾从库¡¿£¬¡¾从库¡¿的查询策略为随机方式¡£

      若某¡¾从库¡¿发生故障£¬将切换到其他可用¡¾从库¡¿£¬若已全部不可用则使用¡¾主库¡¿查询¡£

      出现故障¡¾从库¡¿被隔离起来间隔性的检查可用状态£¬?#28304;ý»指础?#20197; mysql 为例£º

      var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + 
       "Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10";
      
      IFreeSql fsql = new FreeSql.FreeSqlBuilder()
       .UseConnectionString(FreeSql.DataType.MySql, connstr)
       .UseSlave("connectionString1", "connectionString2") //使用从数据库£¬支持多个
       .Build();
      
      select.Where(a => a.Id == 1).ToOne(); //读¡¾从库¡¿£¨默认£©
      select.Master().WhereId(a => a.Id == 1).ToOne(); //强制读¡¾主库¡¿
      其他特性
      • [x] 支持 CodeFirst 迁移£»
      • [x] 支持 DbFirst 从数据库导入实体类£¬支持三种模板生成器£»
      • [x] 采用 ExpressionTree 高性能读取数据£»
      • [x] 支持深入的类型?#25104;ä£?#27604;如pgsql的数组类型£»
      • [x] 支持丰富的表达式函数£»
      • [x] 支持导航属性查询£¬和延时加载£»
      • [x] 支持同步/异步数据库操作方法£¬丰富多?#23454;?#38142;式查询方法£»
      • [x] 支持读写分离¡¢分表分库£»
      • [x] 支持多种数据库£¬MySql/SqlServer/PostgreSQL/Oracle/Sqlite£»
      结束语

      以上就是这篇文章的全部内容了£¬希望本文的内容对大家的学习或者工作具有一定的参考学习价值£¬谢谢大家对脚本之家的支持¡£

      相关文章

      最新评论

      3dÊÔ»úºÅÖвÊÍø

        1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
          <output id="hzk7v"></output>
        2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
        3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

            1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
              <output id="hzk7v"></output>
            2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
            3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>