ORM框架对分表分库之分库和分表指定不同的字段
ORM框架分库分表已实现了
最近我完善了分库分表功能:
分库和分表可以指定不同的字段
首先看下配置上是如何配置的
在配置上相比于上面提到的第3点,配置文件新增了
- dbcolumn 代表db是根据哪个字段分
- column 代表的table是根据哪个字段分
{
"Provider": "mysql",
"Name": "testshardingdbandtableMany",
"ShardingStrategy": "class=AntData.DbEngine.Sharding.ModShardingStrategy;dbcolumn=CityId;column=ID;mod=3;shardByDB=true;shardByTable=true",
"ConnectionItemList": [
{
"Name": "testorm_mysql0",
"Sharding": "0",
"ConnectionString": "Server=127.0.0.1;Port=3306;Database=testorm1;Uid=root;Pwd=123456;charset=utf8;SslMode=none",
"DatabaseType": "Master"
},
{
"Name": "testorm_mysql1",
"Sharding": "1",
"ConnectionString": "Server=127.0.0.1;Port=3306;Database=testorm2;Uid=root;Pwd=123456;charset=utf8;SslMode=none",
"DatabaseType": "Master"
}
]
}
根据上面的配置的意思就是:
- class=AntData.DbEngine.Sharding.ModShardingStrategy代表的是按照取模策略来分表分库
- shardByDB=true;shardByTable=true 开启了分库分表的开关
- dbcolumn=CityId 代表的是分库是按照CityId的来分
- column=ID;代表的是分表是按照ID的值字段来分
- mod=3;代表的分表是按照3来取模
- db的取模是看ConnectionItemList有配置几个,上面的例子是配置2个,所以分库是按照2来取模
对应我的库和表如下
根据codegen来生成代码
注意一点:
代码生成器生成的表需要自己加一个_{0}
例如:[Table(Comment = "订单表", Name = "order_{0}")]
/// <summary>
/// Database : testorm1
/// Data Source : localhost
/// Server Version : 5.6.26-log
/// </summary>
public partial class Entitys : IEntity
{
/// <summary>
/// 订单表
/// </summary>
public IQueryable<Order> Orders { get { return this.Get<Order>(); } }
private readonly IDataContext con;
public IQueryable<T> Get<T>()
where T : class
{
return this.con.GetTable<T>();
}
public Entitys(IDataContext con)
{
this.con = con;
}
}
/// <summary>
/// 订单表
/// </summary>
[Table(Comment = "订单表", Name = "order_{0}")]
public partial class Order : BaseEntity
{
#region Column
/// <summary>
/// 订单号
/// </summary>
[Column("ID", DataType = DataType.Int64, Comment = "订单号"), Nullable]
public long? ID { get; set; } // bigint(20)
/// <summary>
/// 名称
/// </summary>
[Column("Name", DataType = DataType.VarChar, Length = 50, Comment = "名称"), Nullable]
public string Name { get; set; } // varchar(50)
/// <summary>
/// CityId
/// </summary>
[Column("CityId", DataType = DataType.Int64, Comment = "CityId"), Nullable]
public long CityId { get; set; }
#endregion
}
下面来写测试代码验证
/// <summary>
/// 测试mod分库插入到testorm2数据库的order_1表
/// </summary>
[TestMethod]
public void TestMethod6_01()
{
var id = 1;
//查testorm2 的 order_1 表
var odIsExist = DB.Tables.Orders.Any(r => r.ID.Equals(1) && r.CityId == 1);
if (odIsExist)
{
return;
}
var order = new Order
{
ID = 1,//按照id分表
Name = "上海大学",
CityId = 1//按照cityid分库
};
var result = DB.Insert(order);
Assert.AreEqual(result, 1);
}
/// <summary>
/// 测试mod分库插入到testorm1数据库
/// </summary>
[TestMethod]
public void TestMethod6_02()
{
var id = 2;
//查testorm1 的 order_2 表
var odIsExist = DB.Tables.Orders.Any(r => r.ID.Equals(2) && r.CityId == 2);
if (odIsExist)
{
return;
}
var order = new Order
{
ID = 2,
Name = "北京大学",
CityId = 2
};
var result = DB.Insert(order);
Assert.AreEqual(result, 1);
}
[TestMethod]
public void TestMethod6_022()
{
var id = 2;
//3%2=1 查testorm1 的3%3=0 order_0 表
var odIsExist = DB.Tables.Orders.Any(r => r.ID.Equals(3) && r.CityId == 3);
if (odIsExist)
{
return;
}
var order = new Order
{
ID = 3,
Name = "厦门大学",
CityId =3
};
var result = DB.Insert(order);
Assert.AreEqual(result, 1);
}
/// <summary>
/// 测试mod分库 查询testorm2数据库
/// </summary>
[TestMethod]
public void TestMethod6_03()
{
var id = 1;
// 1%2=1 testorm2的 1%3=1 order_1
var tb1 = DB.Tables.Orders.FirstOrDefault(r => r.ID.Equals(1)&&r.CityId ==1);
Assert.IsNotNull(tb1);
}
/// <summary>
/// 测试mod分库 查询testorm1数据库
/// </summary>
[TestMethod]
public void TestMethod6_04()
{
var id = 2;
// 2%2=0 testorm1的 2%3=2 order_2
var tb1 = DB.Tables.Orders.FirstOrDefault(r => r.ID.Equals(2)&&r.CityId ==2);
Assert.IsNotNull(tb1);
}
/// <summary>
/// 测试mod分库 不指定sharing column 查询叠加
/// </summary>
[TestMethod]
public void TestMethod6_05()
{
//没有指定CityID也没有指定ID 会查询2个db的各3张表 6次的叠加
var tb1 = DB.Tables.Orders.ToList();
Assert.IsNotNull(tb1);
Assert.AreEqual(tb1.Count, 3);
//没有指定CityID 那么会查询2个db 。由于指定了ID 那么只会查询 1%3=1 order_1 2%3=2 order_2
var odIsExist = DB.Tables.Orders.Where(r => r.ID.Equals(1) || r.ID.Equals(2)).ToList();
Assert.AreEqual(odIsExist.Count, 2);
}
/// <summary>
/// 测试mod分库修改到testorm2数据库
/// </summary>
[TestMethod]
public void TestMethod6_06()
{
var id = 1;
//没有指定CityID 那么会查询2个db 。由于指定了ID 那么只会查询 1%3=1 order_1
var result = DB.Tables.Orders.Where(r => r.ID.Equals(1)).Set(r => r.Name, y => y.Name + "1").Update();
Assert.AreEqual(result, 1);
}
/// <summary>
/// 测试mod分库修改到testorm1数据库
/// </summary>
[TestMethod]
public void TestMethod6_07()
{
var id = 2;
//没有指定CityID 那么会查询2个db 。由于指定了ID 那么只会查询 2%3=2 order_2
var result = DB.Tables.Orders.Where(r => r.ID.Equals(2)).Set(r => r.Name, y => y.Name + "1").Update();
Assert.AreEqual(result, 1);
}
/// <summary>
/// 测试mod分库删除到testorm2数据库
/// </summary>
[TestMethod]
public void TestMethod6_08()
{
var id = 1;
//没有指定CityID 那么会查询2个db 。由于指定了ID 那么只会查询 1%3=1 order_1
var result = DB.Tables.Orders.Where(r => r.ID.Equals(1)).Delete();
Assert.AreEqual(result, 1);
}
/// <summary>
/// 测试mod分库删除到testorm1数据库
/// </summary>
[TestMethod]
public void TestMethod6_09()
{
var id = 2;
//没有指定CityID 那么会查询2个db 。由于指定了ID 那么只会查询 2%3=2 order_2
var result = DB.Tables.Orders.Where(r => r.ID.Equals(2)).Delete();
Assert.AreEqual(result, 1);
}
/// <summary>
/// 测试mod分库批量分别插入到testorm1 和 testorm2数据库
/// </summary>
[TestMethod]
public void TestMethod7_02()
{
var orderList = new List<Order>();
//会分到3%2=1 testorm2 的 order_0
orderList.Add(new Order
{
ID = 3,
Name = "上海大学",
CityId = 3
});
//会分到4%2=0 testorm1 的 order_1
orderList.Add(new Order
{
ID = 4,
Name = "上海大学",
CityId = 4
});
//没有指定 shading column的话是默认分到第一个分片
orderList.Add(new Order
{
ID = null,
Name = "上海大学",
//CityId = 0
});
var rows = DB.BulkCopy(orderList);
Assert.AreEqual(rows.RowsCopied, 3);
}
[TestMethod]
public void TestMethod7_03()
{
var odIsExist = DB.Tables.Orders.Delete();
}
/// <summary>
/// 指定了shadingtable的分库 自动会走到1对应的db
/// </summary>
[TestMethod]
public void TestMethod7_04()
{
DB.UseShardingDbAndTable("1","1", con =>
{
//1%2 = 1 1%3 = 1 testorm2 的 order_1
var first = con.Tables.Orders.FirstOrDefault();
Assert.IsNotNull(first);
Assert.AreEqual(1, first.ID);
});
}
/// <summary>
/// 指定了shadingtable的分库 自动会走到0对应的db
/// </summary>
[TestMethod]
public void TestMethod7_05()
{
DB.UseShardingDbAndTable("0","0", con =>
{
//0%2 = 0 0%3 = 0 testorm1 的 order_0
var first = con.Tables.Orders.FirstOrDefault();
Assert.IsNotNull(first);
Assert.AreEqual(2, first.ID);
});
}
总结
目前在AntData orm中使用分库分表在使用上是不是很爽:
- 决定好用哪种策略 是取模 还是区间分片
- 支持只分表,只分库,或者既分表又分库
- 如果既分表又分库还可以指定分库和分表的字段不同
- 只需要在配置文件上配置好即可
- 在写代码和平常一样
ORM框架对分表分库之分库和分表指定不同的字段的更多相关文章
- .Net下的分库分表帮助类——用分库的思想来分表
简介 在大型项目中,我们会遇到分表分库的情景. 分库,将不同模块对应的表拆分到对应的数据库下,其实伴随着公司内分布式系统的出现,这个过程也是自然而然就发生了,对应商品模块和用户模块, ...
- 分库分表(6)--- SpringBoot+ShardingSphere实现分表+ 读写分离
分库分表(6)--- ShardingSphere实现分表+ 读写分离 有关分库分表前面写了五篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论 ...
- mysql分表场景分析与简单分表操作
为什么要分表 首先要知道什么情况下,才需要分表个人觉得单表记录条数达到百万到千万级别时就要使用分表了,分表的目的就在于此,减小数据库的负担,缩短查询时间. 表分割有两种方式: 1水平分割:根据一列或多 ...
- ORM框架对分表分库的实现
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- Mysql性能优化四:分库,分区,分表,你们如何做?
分库分区分表概念 分区 就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的 分表 就是把一张数据量很大的表按一定的规则分解成N个具有独立存储空间的实体表.系统读写时 ...
- 分库分表(4) ---SpringBoot + ShardingSphere 实现分表
分库分表(4)--- ShardingSphere实现分表 有关分库分表前面写了三篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论) 3.分库 ...
- (动态模型类,我的独创)Django的原生ORM框架如何支持MongoDB,同时应对客户使用时随时变动字段
1.背景知识 需要开发一个系统,处理大量EXCEL表格信息,各种类别.表格标题多变,因此使用不需要预先设计数据表结构的MongoDB,即NoSQL.一是字段不固定,二是同名字段可以存储不同的字段类型. ...
- .net core 基于Dapper 的分库分表开源框架(core-data)
一.前言 感觉很久没写文章了,最近也比较忙,写的相对比较少,抽空分享基于Dapper 的分库分表开源框架core-data的强大功能,更好的提高开发过程中的效率: 在数据库的数据日积月累的积累下,业务 ...
- 学习sharding-jdbc 分库分表扩展框架
先丢代码地址 https://gitee.com/a247292980/sharding-jdbc 再丢pom.xml的dependency <properties> <projec ...
随机推荐
- 深度学习DeepLearning技术实战研修班
深度学习DeepLearning(Python)实战培训班 时间地点: 2020 年 12 月 18 日-2020 年 12 月 21日 (第一天报到 授课三天:提前环境部署 电脑测试) 一.培训方式 ...
- GlusterFS分布式存储系统复制集更换故障Brick操作记录
场景: GlusterFS 3节点的复制集,由于磁盘故障,其中一个复制集需要重装系统,所以需要重装glusterfs并将该节点加入glusterfs集群 一. 安装GlusterFS 首先在重装系统节 ...
- 手写Netty之多路复用Select小案例
注意:本文只是将上文多路复用器Select.Poll.Epoll区别梳理中提出的概念与Netty中的步骤联系起来,方便后面回顾,代码中注释很多,对于大家来说如果不是怀有同样的目的,不一定有用. 单线程 ...
- day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- The Go Blog Getting to Go: The Journey of Go's Garbage Collector
Getting to Go: The Journey of Go's Garbage Collector https://blog.golang.org/ismmkeynote
- $.extend、$.fn.extend
$.extend 1.扩展jQuery静态方法. $.extend({ myFun:function(){alert('test函数')} min: function(a, b) { return a ...
- 利用Javascript制作网页特效(图像特效)
图像是文本的解释和说明,在网页中的适当位置放置一些图像,不仅可以使文本更加容易阅读,而且可以使网页更加具有吸引力. 当鼠标指针经过图像时图像振动效果 ①:在head标签内输入以下代码: <sty ...
- 《》——8幅图图解Java机制
String对象不可改变的特性 String s = "abcd"; s = s.concat"ef"; equals()与hashCode()方法协作约定 H ...
- redis学习教程一《Redis的安装和配置》
redis学习教程一<Redis的安装和配置> Redis的优点 以下是Redis的一些优点. 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执 ...
- python--基础1(pip,虚拟环境、python编写规范)
python简介 1.Python是一种解释型脚本语言; 2.Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读.易维护,并且被大量用户所欢迎的.用途广泛的语言; 3.pytho ...