dotnetcore / SmartSql

SmartSql = MyBatis in C# + .NET Core+ Cache(Memory | Redis) + R/W Splitting + PropertyChangedTrack +Dynamic Repository + InvokeSync + Diagnostics
https://smartsql.net/
Apache License 2.0
1.1k stars 222 forks source link

Statement 增加配置连接数据库的database="WriteDB"配置的数据库连接 #28

Closed ghd258 closed 6 years ago

ghd258 commented 6 years ago

` 一台写数据库服务器 部署一个sql server数据库实例里面部署了4个数据库(产品数据库、用户数据库、 仓库数据库、订单数据库) N台查询数据库服务器 每台部署的数据库都和写数据库服务器的一样,都是一个sql server 实例和四个数据库(产品数据库、用户数据库、 仓库数据库、订单数据库)表结构等都是一样的,只是用来查询的,当然写和查的数据库数据怎么同步系统不用管。 当初也是有严格的规范的,比如四个数据库的应用必须独立,系统的数据调用必须用调用各自的api,数据库之间不能相互关联查询等,但是现实问题是遇到性能问题,后来都不执行了。 根据我对框架的了解,如果是不同的数据库比如mysql和sql server这种情况的多数据库支持最好的方式就是建立仓储 但是是同一个sql server 有多个数据库的,我的这种场景请问你的框架怎么支持,四个数据库用四个仓储实现,分别配置各自的读和写,而且有时候在特殊场景下会出现多个数据库之间相互关联查询 (个人意见也许不适应你的规范,但是个人认为这种情况不一定一定要去建立四个仓储) 在实际部署的时候,我们以前的场景是比如写数据库部署一台服务器(四个数据库),北京部署一台查询数据库服务器 (四个数据库),上海部署一台查询数据库服务器(四个数据库), 我们的部署是这样的Server端和Web端,数据库部署一台服务器,server部署一台服务器,web部署一台服务器。 数据库服务器的访问是通过server服务器访问,web服务器访问server服务器;web端是有负载均衡的,在部署的时候就已经把server端访问那个数据库配置设置好了,也是就server访问那个查询数据库都已经是配置好的,web端访问那个server端也是之前就配置好的(而且这种部署一般只是是两个通道,一个通道有问题就可以切换到另外一个通道),所有北京的用户访问北京的,上海的访问上海的,具体怎么判断北京和上海不是目前系统关心的。请问你的目前的这个如果要手工配置指定,只能用你的策略,如果要手工配置就不行,这种情况下 多个服务器的数据库 有读和写 每个都是多个数据库这么支持

根据我对框架的了解,其实目前框架底层本身是支持的,而且做个小改动就完全可以支持我提出的场景: 1 修改以下配置的地方就可以做到 `

<Read  Name="ReadDB-1" ConnectionString="Data Source=pc;database=server;uid=root;pwd=111;CharSet=utf8;AllowUserVariables=True"  Weight="1" />`

这里的配置可以有多个写和多个读,或者这里不区分读或者写,只是多个数据库连接,至于那个是读和写用户自己知道,用户自己在开发的方法中根据实际情况配置那个数据库连接即可 2、 在Statement 增加一个配置项目 database="数据库连接" 这个数据库连接就是这个 <Write Name="WriteDB" ConnectionString="Data Source=pc;database=server;uid=root;pwd=111;CharSet=utf8;AllowUserVariables=True"/> 的 name <Statement Id="Insert" database="WriteDB"> `

Ahoo-Wang commented 6 years ago
    <Statement Id="Query_ReadDb2"  ReadDb="ReadDb-2">
      Select Top 10 T.* From T_Entity T
    </Statement>
            var result = _sqlMapper.Query<T_Entity>(new RequestContext
            {
                Scope = Scope,
                SqlId = "Query_ReadDb2"
            });
ghd258 commented 6 years ago

<Statement Id="WriteDb2" ReadDb="WriteDb-2"> Select Top 10 T.* From T_Entity T </Statement> 这里可以支持配置写数据库连接多个吗,如果只能是配置读库,那么如果业务系统要按照不同的业务分为多个库的情况下还有多个数据库的,就有多个写库了,当然多个数据也可以用多个仓储实现,但是仓储比较麻烦,没有这个方便

Ahoo-Wang commented 6 years ago

不可以的,最多只能支持到这个场景。可以指定WriteDb的话就违反SmartSql的规范了。 通过多SmartSqlMapper实例来做吧,这样也有利于你拆分业务。 https://github.com/Ahoo-Wang/SmartSql/releases/tag/v3.6.4