上回说了
1、更完善的orm
2、应用层屏蔽的底层sharding
3、应用层上的cache
那么,直接上代码了。
因为没什么开源经验,所以直接介绍freyja的思想和代码了。
1、cache部分直接改的是spring aop cache
加了几个annotation:
CacheDelete、CacheListReplace 等等。。。。
现在存在2个问题:1、不是线程安全的。2、不知道如何才能像spring 的cache 注解那样 被扫描到:http://www.iteye.com/problems/83419
另外:cache和freyja v2没有任何关系。
cache的介绍有点少,缓存越接近上层效率越高。所以基本上放弃了freyja v1对缓存的理解,改到上层缓存。
通过注解维护缓存的关系。上面的spring cache 拓展实际上是之前写的,现由对其进行了大改。山寨、拓展了spring 自带cache 同样使用spel表达式 CacheSave这个注解略微不同,key取值取的是返回值,以后会补上一篇介绍。
2、orm
orm部分采用自己的annotation:@Id,@Column,@Table,@Transient 用这几个来标注实体与表的关系
orm比纯jdbc带来的开销在于一层的sql解析,sql解析交给了温少的alibaba.druid的sql parser部分来处理。
(温少是谁?:http://code.alibabatech.com/wiki/dashboard.action)
解析的效率很高,具体有多高我没具体测试过。以为无论开销多大对于项目来说是属于可忽略的开销,因为项目的sql都是预编译sql,解析这一层被缓存了所以开销可忽略。
orm的语法上和上一版的基本一致。
3、sharding
Freyja2版本对分库分表的处理方式
sharding部分和orm基本上没任何关系,这个部分只针对纯sql 的处理。我觉得freyja的sharding方式趋于完美
freyja v2的sharding 由@SubColumn决定分库、分表方式。@SubColumn是以这个字段为基准对记录进行切分
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);
}
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);
}
}
配合spring jdbc的AbstractRoutingDataSource 达到一个多数据源操作环境
具体而言如果你需要对t_user表进行分库、分表操作:
1、 <bean id="fryjaTemplate" class="org.freyja.v2.jdbc.FreyjaJdbcTemplate">
<property name="jdbcTemplate" ref="jdbcTemplate" />
<property name="packagesToScan" value="com.x.data.bean" />
<property name="freyjaProperties">
<value>
show_sql=true
db_num=2
table_num=2
id_sub_num=1000000
</value>
</property>
</bean>
配置 db_num、table_num、id_sub_num
id_sub_num为每张表容量,另外建表的时候需要修改对应的自动增长起始值
<bean id="baseDataSource" parent="parentDataSource">
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.user}" />
<property name="password" value="${mysql.password}" />
</bean>
<bean id="dataSource" class="com.guyu.core.spring.datasource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.Integer">
<entry key="0" value-ref="pu_game_0" />
<entry key="1" value-ref="pu_game_1" />
</map>
</property>
<property name="defaultTargetDataSource" ref="baseDataSource" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
2、你需要在User实体上加上@Table(name = "t_user", isSubTable = true)
标注这个表需要切分
3、 @Column(name = "open_id")
@SubColumn(isSubColumn = true)
private String openId;
需要选取其中一个字段标注为SubColumn
sharding针对的是纯jdbc,有兴趣的可以研究下druid的sql parser (ps:资料很少)
其他的补充:
1、为什么freyja1和2都要用spring jdbc?
没什么特别的理由,一直都在用hibernate但先接触的spring jdbc,觉得还不错就用了。另外spring jdbc本身就很接近于orm所以就对他进行了改造。
2、druid
在做freyja v1的时候实际上都有了解过druid的sql parser功能,但是觉得老外的jsqlparser出来得早用的人多会比较好就用了jsqlparser。
后来做v2发展sharding功能的时候联系到了温少,他让我看sql parser。结果真不得了。sql parser要什么有什么,例如orm部分sql parser直接就支持而且非常方便。虽然有点问题但是反馈给温少之后一会儿就解决了。sharding功能也是在交流过程中产生的。
附件中的压缩包中的druid_0.2.11111.jar是包含sharding支持的版本。druid的最新版不知道有没有发布包含这个部分。
还需要大量的测试测试测试和测试,现在freyja v2用于项目当用,有什么需要修复和添加的功能都会随着实际应用而改动。
希望大家就cache、orm、sharding部分的实现思路进行讨论!
分享到:
相关推荐
"Freyja更新"这个标题可能指的是一个名为Freyja的软件或工具的最新版本发布或者升级。Freyja,源自北欧神话中的战争与生育女神,通常在IT领域被用作项目名或软件名,尤其是那些涉及开发、分析或管理的工具。由于描述...
"freyja2多数据源版本"是一个专注于数据库管理和集成的工具,主要针对开发人员和数据库管理员。这个项目可能提供了一种高效的方式,使得应用程序能够同时连接和操作多个不同的数据源,比如MySQL、Oracle、SQL Server...
由于没有具体的功能描述,我们可以假设Freyja可能涵盖了多种工具常见的功能,比如版本控制、构建管理、代码质量检查、性能分析等。 在压缩包文件名称列表中,只有一个文件名 "freyja" 提供,这可能是指整个项目的源...
NULL 博文链接:https://freyja.iteye.com/blog/1278881
根据描述中的 "博文链接",我们可以推断这是一篇在 iteye.com 博客平台上发布的技术文章,编号为 1312344,可能详细介绍了 freyja 的新功能和性能优化的具体情况。 在标签部分,我们看到 "源码" 和 "工具" 两个...
1. **源码管理**:开源工具通常涉及到源码管理和版本控制,如Git,所以Freyja可能与Git集成,允许用户管理代码仓库。 2. **自动化**:作为一个工具,Freyja可能包含自动化脚本编写和执行的功能,例如支持CI/CD...
"准备了个freyja实例项目(单数据源版)"这个标题揭示了我们即将探讨的是一个基于Freyja框架的实战项目,特别强调是单数据源版本。Freyja可能是一个用于构建应用程序的开源框架,而单数据源意味着该项目只连接到一个...
从页面下载最新版本的Freyja并将其解压缩。 从下载模型。 下载所有txt和torchscript文件,并将这些文件放入<app>/models/文件夹中。 运行freyja.exe 。 如果您有Nvidia GPU,则启用“ Enable CUDA选项,否则禁用该...
FREYJA freyja是一个轻量级的blog系统,使用vue-ssr,首屏在服务端渲染,之后的所有请求都由浏览器自行路由。 文章页只有文章内容在服务端渲染,评论是浏览器ajax加载的。 配合http2多路复用,首屏渲染完成时间可以...
弗雷雅 功能齐全的功能CSS-in-JS解决方案,从改编而成,使其适合生产网站。...通过npm i freyja安装。 创建样式化的组件。 import useStyles from 'freyja' // this could be in a separate file if you like cons
matlab有些代码不运行Freyja仿真器 在MATLAB / Simulink(TM)和SimScape(TM)框架内构建的,适用于多直升机系统的高保真物理模拟器。 Freyja的库元素允许对连接多轴直升机和各种其他对象(例如电缆)的运动树进行...
标题“jre-超级精简普通版版”指的是一个针对Java运行环境(Java Runtime Environment, JRE)的轻量级版本。JRE是Java应用程序执行所必需的组件,它包含了Java虚拟机(JVM)、类库以及其他支持Java程序运行的必要...
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”(免费图片)有关,但具体...