数据库分库

2019-04-04 17:40 更新

WTM框架支持自动选择读写分离的数据库,以及根据条件动态使用不同的数据库连接

读写分离
框架会自动识别ConnectionString中以下划线+数字结尾的key值,作为只读库,比如下面的定义:
  1. "ConnectionStrings": [
  2. {
  3. "Key": "default",
  4. "Value": "Server=(localdb)\\mssqllocaldb;Database=demo;Trusted_Connection=True;MultipleActiveResultSets=true"
  5. },
  6. {
  7. "Key": "default_1",
  8. "Value": "Server=(localdb)\\mssqllocaldb;Database=demo1;Trusted_Connection=True;MultipleActiveResultSets=true"
  9. },
  10. {
  11. "Key": "default_2",
  12. "Value": "Server=(localdb)\\mssqllocaldb;Database=demo2;Trusted_Connection=True;MultipleActiveResultSets=true"
  13. },
  14. {
  15. "Key": "default_3",
  16. "Value": "Server=(localdb)\\mssqllocaldb;Database=demo3;Trusted_Connection=True;MultipleActiveResultSets=true"
  17. },
  18. ]

这个配置文件定义了四个连接字符串,default是写库,default_1,default_2,default_3是三个只读库

框架会默认在所有标记了HttpPost的Controller方法中使用写库来创建DataContext,而在其他方法中随机选择一个读库

指定连接字符串

如果框架的默认实现不能满足需求,可以使用FixConnection属性来指定连接字符串,比如下面的Controller

  1. [FixConnection(DBOperationEnum.Read, CsName = "test")]
  2. [HttpPost]
  3. public IActionResult Create()
  4. {
  5. var testDc = this.DC;
  6. return PartialView();
  7. }

通过在方法上加FixConnection,我们指定这个方法里的DC应该使用连接字符串是test开头的只读库,框架会去寻找比如test_1,test_2,test_3...这种key值的连接字符串,如果找不到就会使用叫test的连接字符串,如果仍然找不到,则会使用默认的default

另一种指定连接字符串的方法是不使用Controller和VM中已经生成的DC,而是直接使用指定连接字符串新实例化一个DataContext,比如

  1. [HttpPost]
  2. public IActionResult Create()
  3. {
  4. var testDc = new DataContext("test_2");
  5. return PartialView();
  6. }

以上代码指定使用key值为test_2的连接字符串来创建一个新的DataContext

动态选择连接字符串

框架可以根据页面传递过来的数据,或者session里的信息等动态选择需要连接的数据库,请看以下代码

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. BuildWebHost(args).Run();
  6. }
  7. public static IWebHost BuildWebHost(string[] args) =>
  8. WebHost.CreateDefaultBuilder(args)
  9. .ConfigureServices(x =>
  10. {
  11. x.AddFrameworkService(CsSector: CSSelector);
  12. x.AddLayui();
  13. })
  14. .Configure(x =>
  15. {
  16. x.UseFrameworkService();
  17. })
  18. .Build();
  19. public static string CSSelector(ActionExecutingContext context)
  20. {
  21. var userinfo = (context.Controller as BaseController).LoginUserInfo;
  22. if(userinfo == null)
  23. {
  24. return "default";
  25. }
  26. else
  27. {
  28. if (userinfo.ITCode.StartsWith("a"))
  29. {
  30. return "user1";
  31. }
  32. else
  33. {
  34. return "user2";
  35. }
  36. }
  37. }
  38. }

上面的代码将一个用于选择连接字符串的函数传给了AddFrameworkService,这个函数根据当前登录用户来选择使用的数据库。没有登陆时用default,用户名以a开头时用user1库,其他用user2库


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号