AntData ORM框架是我维护的一个开源ORM框架
该框架是在Linq2db这个优秀的linq转sql引擎基础上进行改造而来的。
分离了linq2sql引擎和db执行逻辑。
画一个图的话 应该是这样的:
分表分库功能设计
框架内置目前使用比较多的两种分片模式:
取模 (mod)
范围 (range)
为了让框架更容易扩展
开放分片策略的接口 当有自定义分片规则可以继承实现
下面我用内置的 取模 分片模式来说明 ,运行环境: netcore平台
1. DB Sharding
db配置:
Provider 指定为 mysql
Name 是逻辑名称 可以随意指定
ShardingStrategy 指定分片的逻辑处理
ConnectionItemList 指定一个或多个db链接配置
注意:
class=AntData.DbEngine.Sharding.ModShardingStrategy;column=ID;mod=2;shardByDB=true
的意思是:
采用内置的取模分片法,走分片的字段叫ID mod为2 也就是1分为2个 分别是 (0 和 1),所以下面的ConnectionItemList指定的 Sharding分别是0和1的数据库连接
按照上面的配置的话,当满足
表还有字段ID
db搜索的条件含有id字段,或者 db更新的条件含有id字段 或者db删除的条件含有id字段
都应该走取模算法来走对应的db。
下面来测试它
DB Sharding 使用场景举例说明
///
/// 测试mod分库插入到testorm2数据库
///
[TestMethod]
public void TestMethod6_01()
{
//id查询 1 mod 2 = 1 所以会走到 testorm2数据库
var id = 1;
var odIsExist = DB.Tables.Orders.Any(r => r.ID.Equals(1));
if (odIsExist)
{
return;
}
var order = new Order
{
ID = 1,
Name = "上海大学"
};
var result = DB.Insert(order);
Assert.AreEqual(result, 1);
}
///
/// 测试mod分库插入到testorm1数据库
///
[TestMethod]
public void TestMethod6_02()
{
var id = 2;
var odIsExist = DB.Tables.Orders.Any(r => r.ID.Equals(2));
if (odIsExist)
{
return;
}
var order = new Order