• XCode v8.11 重量级分表分库(无视海量数据)


    XCode天生就有分表分库功能,设计于2005年!
    历时9年,这是分表分库功能第一次针对性正式更新。

    在XCode里面,分表分库非常简单,在操作数据(查询/更新)前修改Meta.ConnName/Meta.TableName,指向别的连接字符串和表名,就实现了分表分库功能!
    实际上,XCode实体层构建数据操作SQL(Select/Insert/Update/Delete)时,依赖于Meta.TableName,执行SQL时,依赖于Meta.ConnName。所以,修改这两个即可实现数据操作的重定向!
    为了避免多线程误伤以及混乱,这两个属性的修改,都是仅对本线程有效!

    实例代码如下:

    var entity = User.FindByID(1);
    entity.Account = "大石头" + DateTime.Now;
    User.Meta.ProcessWithSplit(null, "User2", () => entity.Insert());
    using (var sp = User.Meta.CreateSplit(null, "User3"))
    {
        entity.Insert();
    }

    这里展示了两种分表分库的用法!
    新增加的两个API是
    ProcessWithSplit和CreateSplit,前两个参数就是ConnName和TableName,意思是在目标连接/表名上进行数据库操作。
    这两个API都具有连接名表名还原功能,也就是说,执行完目标数据操作代码以后,连接名和表名要还原回来当前状态。

    执行日志如下:

    03:38:28.996 9 N - Select * From [User] Order By ID Desc
    03:38:29.038 9 N - 完成更新缓存(第1次):NewLife.CommonEntity.User
    03:38:29.118 9 N - 检查实体NewLife.CommonEntity.User的数据表架构,模式:CheckTableWhenFirstUse
    03:38:29.208 9 N - 创建表:User2(用户)
    03:38:29.225 9 N - Create Table User2(
        ID int IDENTITY(1,1) Primary Key,
        Account nvarchar(50) NULL,
        Password nvarchar(50) NULL,
        IsAdmin bit NULL,
        IsEnable bit NULL
    )
    03:38:29.234 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'用户' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User2'
    03:38:29.241 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'编号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User2', @level2type=N'COLUMN',@level2name=N'ID'
    03:38:29.250 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'账号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User2', @level2type=N'COLUMN',@level2name=N'Account'
    03:38:29.256 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'密码' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User2', @level2type=N'COLUMN',@level2name=N'Password'
    03:38:29.262 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'是否管理员' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User2', @level2type=N'COLUMN',@level2name=N'IsAdmin'
    03:38:29.267 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'是否启用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User2', @level2type=N'COLUMN',@level2name=N'IsEnable'
    03:38:29.273 9 N - Create Unique Index IX_User2_Account On User2 (Account)
    03:38:29.280 9 N - select rows from sysindexes where id = object_id('User2') and indid in (0,1)
    03:38:29.290 9 N - 开始初始化User用户数据……
    03:38:29.299 9 N - Select Count(*) From User2 Where Account=N'admin'
    03:38:29.319 9 N - SET NOCOUNT ON;Insert Into User2(Account, Password, IsAdmin, IsEnable) Values(N'admin', N'21232F297A57A5A743894A0E4A801FC3', 1, 1);Select SCOPE_IDENTITY()
    03:38:29.330 9 N - 完成初始化User用户数据!
    03:38:29.333 9 N - Select * From User2 Where Account=N'大石头2014/6/16 3:38:29' Order By ID Desc
    03:38:29.342 9 N - SET NOCOUNT ON;Insert Into User2(Account, Password, IsAdmin, IsEnable) Values(N'大石头2014/6/16 3:38:29', N'21232F297A57A5A743894A0E4A801FC3', 1, 1);Select SCOPE_IDENTITY()
    03:38:29.354 9 N - 检查实体NewLife.CommonEntity.User的数据表架构,模式:CheckTableWhenFirstUse
    03:38:29.381 9 N - 创建表:User3(用户)
    03:38:29.383 9 N - Create Table User3(
        ID int IDENTITY(1,1) Primary Key,
        Account nvarchar(50) NULL,
        Password nvarchar(50) NULL,
        IsAdmin bit NULL,
        IsEnable bit NULL
    )
    03:38:29.390 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'用户' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User3'
    03:38:29.395 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'编号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User3', @level2type=N'COLUMN',@level2name=N'ID'
    03:38:29.401 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'账号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User3', @level2type=N'COLUMN',@level2name=N'Account'
    03:38:29.407 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'密码' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User3', @level2type=N'COLUMN',@level2name=N'Password'
    03:38:29.412 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'是否管理员' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User3', @level2type=N'COLUMN',@level2name=N'IsAdmin'
    03:38:29.420 9 N - EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'是否启用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User3', @level2type=N'COLUMN',@level2name=N'IsEnable'
    03:38:29.425 9 N - Create Unique Index IX_User3_Account On User3 (Account)
    03:38:29.431 9 N - select rows from sysindexes where id = object_id('User3') and indid in (0,1)
    03:38:29.440 9 N - 开始初始化User用户数据……
    03:38:29.442 9 N - Select Count(*) From User3 Where Account=N'admin'
    03:38:29.446 9 N - SET NOCOUNT ON;Insert Into User3(Account, Password, IsAdmin, IsEnable) Values(N'admin', N'21232F297A57A5A743894A0E4A801FC3', 1, 1);Select SCOPE_IDENTITY()
    03:38:29.452 9 N - 完成初始化User用户数据!
    03:38:29.455 9 N - Select * From User3 Where Account=N'大石头2014/6/16 3:38:29' Order By ID Desc
    03:38:29.462 9 N - SET NOCOUNT ON;Insert Into User3(Account, Password, IsAdmin, IsEnable) Values(N'大石头2014/6/16 3:38:29', N'21232F297A57A5A743894A0E4A801FC3', 1, 1);Select SCOPE_IDENTITY()

    日志中可以看到,第一次分表到User2时,XCode发现User2表不存在,马上开动反向工程来创建一张一模一样的表。该操作无视配置文件中关于反向工程的配置,即使配置关闭反向工程,这里仍然有效。
    我们还看到,User2表也进行了数据初始化,实体类User.InitData里面检测数据表是否有数据,如果没有,则自动添加一条。
    所以,数据初始化是表级有效,而不是实体类级别有效。
    在Insert User2之前,有一次根据Account的查询,但是我们代码里面并没有这一次查询,怎么回事?
    原来,Account是唯一索引,XCode的Valid会自动检查,在数据插入到数据库之前提前报警,而不是等待数据库报错。
    同样,User3也经历了这个过程!

    分表分库,可以让我们根据业务需要(一般是时间),把不同数据分散在不同数据库和不同数据表中。
    因此,XCode能够让你的系统完全无视海量数据,完全无视性能!(分表后单表性能提升)

    当然,分表分库的根基是反向工程,没有它,你只能自己手工建立数据库和数据表!
    我们相信,XCode的分表分库功能在当下的数据映射框架中是独一无二的!

    End.

  • 相关阅读:
    Number原生类型的扩展
    复杂参数的基本使用方式
    使用Number原生类型
    Function原生类型
    面向对象类型系统
    Error原生类型的扩展
    Date原生类型的扩展
    flex学习网站大全(转)
    如何调试javaScript
    使用JavaScriptConverter实现返回DataTable对象
  • 原文地址:https://www.cnblogs.com/nnhy/p/XCodeSplit.html
Copyright © 2020-2023  润新知