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.
XCode v8.11 重量级分表分库(无视海量数据)的更多相关文章
- [NewLife.XCode]反向工程(自动建表建库大杀器)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...
- [NewLife.XCode]分表分库(百亿级大数据存储)
NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量 ...
- .NETCore 下支持分表分库、读写分离的通用 Repository
首先声明这篇文章不是标题党,我说的这个类库是 FreeSql.Repository,它作为扩展库现实了通用仓储层功能,接口规范参考 abp vnext 定义,实现了基础的仓储层(CURD). 安装 d ...
- 总结下Mysql分表分库的策略及应用
上月前面试某公司,对于mysql分表的思路,当时简要的说了下hash算法分表,以及discuz分表的思路,但是对于新增数据自增id存放的设计思想回答的不是很好(笔试+面试整个过程算是OK过了,因与个人 ...
- 由mysql分区想到的分表分库的方案
在分区分库分表前一定要了解分区分库分表的动机. 对实时性要求比较高的场景,使用数据库的分区分表分库. 对实时性要求不高的场景,可以考虑使用索引库(es/solr)或者大数据hadoop平台来解决(如数 ...
- .Net 下高性能分表分库组件-连接模式原理
ShardingCore ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵. Github Source Code 助 ...
- .Net下你不得不看的分表分库解决方案-多字段分片
.Net下你不得不看的分表分库解决方案-多字段分片 介绍 本期主角:ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 ...
- 学会数据库读写分离、分表分库——用Mycat,这一篇就够了!
系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...
- sharding sphere 分表分库 读写分离
sharding jdbc: sharding sphere 的 一部分,可以做到 分表分库,读写分离. 和 mycat 不同的 是 sharding jdbc 是 一个 jdbc 驱动 在 驱动这个 ...
随机推荐
- 【java】:枚举小demo
package com.jwis.study.enumeration; /** * @author lx * 枚举的一些方法 */ //⑴ enum Substar{tst1,tst2,ts3} pu ...
- select制作分层级目录,让select显示和可下拉选择的"不一样"
今天遇到一个特殊的select问题,需求是这样的:每次点击这个select时,根据选择的option的值做出相应的处理并返回新的select,option内容.所以大致思路是给这个select绑定ch ...
- 解决 Oracle exp导出表数据时空表不能导出的问题
一.不能导出空表的原因 1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参 ...
- linq group by max 多表链接实例
SELECT s.* FROM dbo.ERG_TipOffsInfo s, (SELECT Data,MAX(Createtime) max_Time FROM dbo.ERG_TipOffsInf ...
- WinCE下读取注册表获得SD路径
WinCE下读取注册表获得SD路径 [要点]WinCE注册表中[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMemory\] 下键Folde ...
- Linux 忘记root登录密码解决方法
很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步骤如下: 重启linux系统 3 ...
- SmartUpload实现文件上传时file和表单文本同时提交的问题
JSP页面: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8 ...
- Windows 终端服务器授权 激活
一.激活2003终端授权服务器 首先确认是否安装windows组件 添加删除程序——添加删除windows组件 终端服务器的安装就不介绍了,下面说一下激活授权服务器. 1)点击”开始”->” ...
- eclipse js 引用跳转
引用 http://stackoverflow.com/questions/24505993/the-resource-is-not-on-the-build-path-of-a-javascript ...
- nginx简易安装
yum -y install perl-ExtUtils-Embed ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx ...