数据库分库
WTM框架支持自动选择读写分离的数据库,以及根据条件动态使用不同的数据库连接
读写分离- "ConnectionStrings": [
- {
- "Key": "default",
- "Value": "Server=(localdb)\\mssqllocaldb;Database=demo;Trusted_Connection=True;MultipleActiveResultSets=true"
- },
- {
- "Key": "default_1",
- "Value": "Server=(localdb)\\mssqllocaldb;Database=demo1;Trusted_Connection=True;MultipleActiveResultSets=true"
- },
- {
- "Key": "default_2",
- "Value": "Server=(localdb)\\mssqllocaldb;Database=demo2;Trusted_Connection=True;MultipleActiveResultSets=true"
- },
- {
- "Key": "default_3",
- "Value": "Server=(localdb)\\mssqllocaldb;Database=demo3;Trusted_Connection=True;MultipleActiveResultSets=true"
- },
- ]
-
这个配置文件定义了四个连接字符串,default是写库,default_1,default_2,default_3是三个只读库
框架会默认在所有标记了HttpPost的Controller方法中使用写库来创建DataContext,而在其他方法中随机选择一个读库
如果框架的默认实现不能满足需求,可以使用FixConnection属性来指定连接字符串,比如下面的Controller
- [FixConnection(DBOperationEnum.Read, CsName = "test")]
- [HttpPost]
- public IActionResult Create()
- {
- var testDc = this.DC;
- return PartialView();
- }
-
通过在方法上加FixConnection,我们指定这个方法里的DC应该使用连接字符串是test开头的只读库,框架会去寻找比如test_1,test_2,test_3...这种key值的连接字符串,如果找不到就会使用叫test的连接字符串,如果仍然找不到,则会使用默认的default
另一种指定连接字符串的方法是不使用Controller和VM中已经生成的DC,而是直接使用指定连接字符串新实例化一个DataContext,比如
- [HttpPost]
- public IActionResult Create()
- {
- var testDc = new DataContext("test_2");
- return PartialView();
- }
以上代码指定使用key值为test_2的连接字符串来创建一个新的DataContext
框架可以根据页面传递过来的数据,或者session里的信息等动态选择需要连接的数据库,请看以下代码
- public class Program
- {
- public static void Main(string[] args)
- {
- BuildWebHost(args).Run();
- }
- public static IWebHost BuildWebHost(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .ConfigureServices(x =>
- {
- x.AddFrameworkService(CsSector: CSSelector);
- x.AddLayui();
- })
- .Configure(x =>
- {
- x.UseFrameworkService();
- })
- .Build();
- public static string CSSelector(ActionExecutingContext context)
- {
- var userinfo = (context.Controller as BaseController).LoginUserInfo;
- if(userinfo == null)
- {
- return "default";
- }
- else
- {
- if (userinfo.ITCode.StartsWith("a"))
- {
- return "user1";
- }
- else
- {
- return "user2";
- }
- }
- }
- }
-
上面的代码将一个用于选择连接字符串的函数传给了AddFrameworkService,这个函数根据当前登录用户来选择使用的数据库。没有登陆时用default,用户名以a开头时用user1库,其他用user2库
更多建议: