zoukankan      html  css  js  c++  java
  • 读写分离子系统

    A2D Framework增加了EF支持,加上原先支持ADO.NET:

    1. 支持EF方式
    2. 支持ADO.NET方式

    这次来讲如何让Entity Framework变成nb的读写分离

    1. 先设计EF模型, 可以图形方式设计,也可以数据库优先方式设计,总之设计完后,再转换成Code方式使用(用)

     

    2. 在DbContext类中,删除EF自动添加的报错代码,如下:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
                throw new UnintentionalCodeFirstException();//直接删除这句
    }

    3. 在根目录中增加A2D配置文件A2D.config:

    <?xml version="1.0" encoding="utf-8" ?>
    <A2D>
      <SQLDispatcher>
        <WritableDB>server=192.168.1.20;User ID=sa;Password=111111;database=DFH;Connection Reset=FALSE</WritableDB>
        <ReadDBs>
          <DB>server=192.168.1.21;User ID=sa;Password=111111;database=DFH;Connection Reset=FALSE</DB>
          <DB>server=192.168.1.22;User ID=sa;Password=111111;database=DFH;Connection Reset=FALSE</DB>
        </ReadDBs>
      </SQLDispatcher>
    </A2D>

    4. 编写查询接口、查询Impl

    interface IOrder
    {
            [SQLDispatcher]
            List<Order> QueryOrders(string keyword);
    }
    [AOPServiceEnabled]
    class OrderImpl : ContextBoundObject, IOrder { private IRepository repository = ObjectFactory.Resolve<IRepository>(); public List<Order> QueryOrders(string keyword) { List<Order> orders=repository.Get<Order>(filter: w => w.FirstName.IndexOf(keyword)>=0);
    return orders; } }

    5. 注入EF的SQL Dispatcher对象

    A2DConfig.LoadConfig();
    
    ObjectFactory.Register<DbContext, MyEntities>();//MyEntities是第二步中T4生成的那个DbContext class
    ObjectFactory.Register<IRepository, IntelligentEFRepository>();
    
    ObjectFactory.Register<IOrder, OrderImpl>();//注册Order的实现逻辑类
    
    var bl = ObjectFactory.Resolve<IOrder>();
    
    List<Order> orders=bl.QueryOrders("test");

    搞定。

    其他:A2D.config中,还可以加入Region的概念,如下:

    <SQLDispatcher>
        <WritableDB>Server=.;Database=d1;User Id=sa;Password=111111;</WritableDB>
        <ReadDBs>
          <DB>Server=.;Database=d2;User Id=sa;Password=111111;</DB>
          <DB>Server=.;Database=d3;User Id=sa;Password=111111;</DB>
          <DB>Server=.;Database=d4;User Id=sa;Password=111111;</DB>
        </ReadDBs>
        <DedicatedReadDBs>
          <DedicatedRegion>
            <Region>Optimization_Sales</Region>
            <DB>Server=.;Database=d5;User Id=sa;Password=111111;</DB>
            <DB>Server=.;Database=d6;User Id=sa;Password=111111;</DB>
          </DedicatedRegion>
          <DedicatedRegion>
            <Region>Optimization_HR</Region>
            <DB>Server=.;Database=d7;User Id=sa;Password=111111;</DB>
          </DedicatedRegion>
        </DedicatedReadDBs>
      </SQLDispatcher>

    也就是所有的读操作可以刻意指定由哪台db来处理,比如某台server性能比较好,或者某台server专门给某语句做了极端优化。。。

    此时就能用上面这个配置文件,当然C#那边也要修改成匹配的Region:

    interface IOrder
    {
            [SQLDispatcher("Optimization_Sales")]  //这样,这句sql调用就会被redirect到专门为sales做过优化的那台server(也能支持多台)了
            List<Order> QueryOrders(string keyword);
    }

    Caution:这种技术需要搭配Sql server的复制高级功能才能实现数据在master与slaves之间复制,这个技术请大家自己搞定吧(考虑到底延时),我没有多少经验(demo过而已,你懂的,哈哈,请大家请教真正的DBA来做这事吧)

    BUT:其实,有个办法能绕过上面这个Caution, 不过先卖个关子,等下次讲。

  • 相关阅读:
    laydate指定日期不可选
    kindeditor上传及播放视频的问题
    【Mood】八上期末考
    关于Java注解(annotation)的简单理解
    关于RabbitMQ的简单理解
    关于MongoDB的简单理解(三)--Spring Boot篇
    关于MongoDB的简单理解(二)--Java篇
    关于linux系统密码策略的设置(转载)
    mysq 报错, sql语句在数据库里运行正常, 在内网测试正常,打包放外网的时候就报下面错误
    java mybatisplus+springboot服务器跨域问题
  • 原文地址:https://www.cnblogs.com/aarond/p/A2DEF.html
Copyright © 2011-2022 走看看