在freyja2里面,对于数据库sharding这方面一张表需要设定一个切分的key列
假设UserProperty 里面有 id,uid,pid,num这4个字段,uid为用户id。我们把这张表以uid来切分
数据库设定为2个, 表切分为5个/库。
db_0,
t_user_0,t_user_1,t_user_2,t_user_3,t_user_4
t_user_property_0,t_user_property_1,t_user_property_2,t_user_property_3,t_user_property_4
db_1,
t_user_0,t_user_1,t_user_2,t_user_3,t_user_4
t_user_property_0,t_user_property_1,t_user_property_2,t_user_property_3,t_user_property_4
freyja2屏蔽了上层分库、分表逻辑
在开发过程中,insert、update、select、delete操作和非sharding 项目没有任何差别
insert一条user记录,
insert user(name)values(?)
如果user是以name列为切分的key列,那么name为?的这条记录会被分配到
public DbResult getShardingTableName(Object value) {
String tableName = getTableName();
int hashCode = value.hashCode();
if (hashCode < 0) {
hashCode = -hashCode;
}
int dbNo = hashCode % ShardingUtil.engine.getDbNum();
int tableNo = hashCode % ShardingUtil.engine.getTableNum();
tableName = tableName + "_" + tableNo;
return new DbResult(tableName, tableNo, dbNo);
}
dbNo数据库的tableNo表
这个时候user的主键:id为自动增长,自然获得了一个对应的id值。那么在查询的时候,
无论是select * from User where id = ? 还是 select * from User where name = ?
都能够找到其所在的dbNo 和tableNo
idSubNum 为每个表的容量
public DbResult getShardingTableNameById(Object idValue) {
String tableName = getTableName();
if (idValue == null || !isSubTable()) {
return new DbResult(tableName, -1, -1);
} else {
int n = (Integer) idValue / ShardingUtil.engine.getIdSubNum();
int dbNo = n / ShardingUtil.engine.getTableNum();
int tableNo = n % ShardingUtil.engine.getTableNum();
tableName = tableName + "_" + tableNo;
return new DbResult(tableName, tableNo, dbNo);
}
}
单表的sharding就不多说了,联表查询?
假设有原有这样的一条查询sql:
select * from t_user_property p left join t_user u on p.uid = u.id where u.name = ?
对于sharding之后的应用来说 sql当然不能这样写。
前面说了2点:
1、freyja2是屏蔽上层sharding逻辑的。
2、user的name和id对应的是同一张表、库
在freyja2的处理里面,sql还是按照这样写,根据逻辑freyja根据name的值解析出了user所在的dbNo和tableNo
重新生成sharding的sql(假设tableNo为3,dbNo的作用在于找到对于的数据源):
select * from t_user_property_3 p left join t_user_3 u on p.uid = u.id where u.name = ?
t_user_property 这个表因为也是以uid来分库的,所以其对应的表和库实际上与t_user是一致的。
有2种复杂一点的情况:
1、单表查询不包括key列
2、联合查询以非key列为join列
对于第一种情况,freyja会扫描所有的库、表汇总一个结果集返回来 例如:
select * from t_user where gold > 0
会变为
db_0:
select * from t_user_0 where gold > 0;
select * from t_user_1 where gold > 0;
select * from t_user_2 where gold > 0;
select * from t_user_4 where gold > 0;
db_1:
select * from t_user_0 where gold > 0;
select * from t_user_1 where gold > 0;
select * from t_user_2 where gold > 0;
select * from t_user_4 where gold > 0;
对于第二种情况:
第二种情况比较少见,不可能跨数据源查询。一般既然分库,key列就成为了关键列。所有sql都要围绕着这个列,处理起来需要进行一些变通,暂时没有深挖这部分sql的处理
至于排序、分页存在一种情况:就是非key列的查询,sql中如果带有key列那么排序、分页实际上就是普通的查询一样,数据库来做。但是一旦需要扫描整个库,排序和分页是需要freyja2在返回结果集的时候处理的
在项目里面分出了2个库一共有3个库:db,db_0,db_1 db0和1是存储需要分库的表 db则放置不需要分库的表,毕竟不是每个表都要去分库的。
至于数据迁移和扩容,这部分还未想出比较好的方法。
sharding这部分我一直都认为这是数据库分内的事,应该可以把freyja的sharding这部分再提取出来放在驱动一层上,更加的脱离业务
分享到:
相关推荐
这通常包括更高效的分支管理、合并冲突解决机制的优化,以及对不同编程语言版本的支持。例如,可能添加了对Git新特性的集成,如Git LFS(大型文件存储)支持,以便更好地处理项目中的大文件。 其次,Freyja在工具...
"freyja2多数据源版本"是一个专注于数据库管理和集成的工具,主要针对开发人员和数据库...以上是对"freyja2多数据源版本"可能包含的知识点的详细解析,具体的功能和使用细节,还需结合实际的源代码和测试资源进行探索。
由于没有具体的功能描述,我们可以假设Freyja可能涵盖了多种工具常见的功能,比如版本控制、构建管理、代码质量检查、性能分析等。 在压缩包文件名称列表中,只有一个文件名 "freyja" 提供,这可能是指整个项目的源...
"Freyja更新"这个标题可能指的是一个名为Freyja的软件或工具的最新版本发布或者升级。Freyja,源自北欧神话中的战争与生育女神,通常在IT领域被用作项目名或软件名,尤其是那些涉及开发、分析或管理的工具。由于描述...
2. **缓存优化**:利用缓存技术,如 Memcached 或 Redis,存储频繁访问的数据,减少数据库查询,显著提高处理速度。 3. **并发处理**:优化服务器处理并发请求的能力,例如采用多线程、异步IO或者事件驱动的编程...
NULL 博文链接:https://freyja.iteye.com/blog/1278881
"Freyja"是一个工具,它的主要功能已经完成。根据提供的信息,我们可以推断Freyja可能是一个...同时,下载压缩包中的“freyja”文件,很可能是Freyja的源代码,通过阅读源码,开发者可以深入理解其工作原理和实现方式。
"准备了个freyja实例项目(单数据源版)"这个标题揭示了我们即将探讨的是一个基于Freyja框架的实战项目,特别强调是单数据源版本。Freyja可能是一个用于构建应用程序的开源框架,而单数据源意味着该项目只连接到一个...
从页面下载最新版本的Freyja并将其解压缩。 从下载模型。 下载所有txt和torchscript文件,并将这些文件放入<app>/models/文件夹中。 运行freyja.exe 。 如果您有Nvidia GPU,则启用“ Enable CUDA选项,否则禁用该...
您提供一个接受组件props和应用程序theme的函数,并返回样式图( (theme, props, helpers) => ({key1: style, key2: style}) ), useStyles将返回类名的地图(像{key1: className, key2: className} )。...
FREYJA freyja是一个轻量级的blog系统,使用vue-ssr,首屏在服务端渲染,之后的所有请求都由浏览器自行路由。 文章页只有文章内容在服务端渲染,评论是浏览器ajax加载的。 配合http2多路复用,首屏渲染完成时间可以...
Freyja的库元素允许对连接多轴直升机和各种其他对象(例如电缆)的运动树进行动力学模拟和控制。 可以使用Simulink或SimScape中的内置块轻松配置其他常规对象,例如具有各种惯性属性的实体。 用法 为您的项目创建一...
2. **lib**:这个目录包含Java类库,如基础类库(rt.jar)、本地方法库(native libraries)和一些工具库。精简版可能会移除一些非必要的库,以减少体积,例如针对特定技术或应用的扩展库。 为了在实际环境中使用这...
NULL 博文链接:https://freyja.iteye.com/blog/1167392
魔幻现实Magic Reality Mod Pack (Minecraft) 的官方 Github 页面#Mods 模组作者版本苹果核Squeek502 1.1.0 水产养殖Shadowclaimer, Lclc98, Freyja, Rebelkeithy 1.2.5.8 护甲状态HUD 业务员1.28 背包埃达莫斯2.0.1...
回到Freislenbator-crx,这款插件的名称可能源于一种幽默或网络文化元素,"Freislenbator"可能是创造者为插件赋予的虚构名称,与“Freyja”(北欧神话中的爱与美的女神)或者“free image”(免费图片)有关,但具体...