精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-17
最后修改:2011-11-23
简介: FreyjaJdbcTemplate的开发前言Freyja = JdbcTemplate + naming SQL + Cache;
Freyja是在spring的JdbcTemplate基础上的一层封装,核心是naming SQL部分。
@Entity @Table(name = "t_user") public class User { @Id @GeneratedValue @Column(name = "uid") private Integer id; private String name; @Transient private Integer level; @ManyToOne @JoinColumn(name = "propertyId") private Property property; private Integer propertyId; } User 对应的表结构为
t_user{ int(11) uid, varchar(32) name, int(11) propertyId }
可以看出annotation规则与JPA的一致,但是这不是JPA,仅仅是naming SQL,不支持其他注解。但是提供了@ManyToOne注解帮助关联加载实体。每个字段都需要在User实体内配置好映射关系。
freyja仅支持sql语法,通过jsqlparser这个工具将sql结构化并且在此基础上做nameing SQL和Cache
目前仅提供的主要接口:
<T> T get(String entityName, Object id); <T> Object save(T entity); <T> void update(T entity); <T> void saveOrUpdate(T entity); <T> Object delete(T entity); void executeUpdate(String hql, Object... args); List find(Integer first, Integer max, String hql, int type, Object... args); 其他的接口都是通过这几个衍化出来。 使用Freyja需要注意的地方: 1、对事务的支持待完善。(目前没有办法实现事务的隔离性。) 2、Freyja通过表达式来维护缓存。 3、 4、没有查询缓存,(待完善) 5、不支持通过原生sql 执行update/delete语句,这样很难维护缓存。 等这4个完善之后正式版就可以发布出来了!
开发Freyja我希望达到的目的有2个:
1、全SQL语法支持。 如select k.*,j.c from (select date(paytime) as p,sum(total), count(*),sum(buynum) from GameOrder group by date(paytime)) k left join (select x.u as b,count(*) as c from (select date(paytime) as u,count(regUserId),regUserId from GameOrder group by date(paytime),regUserId) x group by x.u) j on j.b = k.p order by k.p desc 2、通过掌握缓存大幅提高程序的性能。
附件有 源码 和 一份很粗糙的test例子。hibernate与freyja的一个比较,insert、update、select性能。如果你想看看freyja能支持哪些复杂点的sql也可以试试。 一些函数估计不支持union语法也不支持 。能测试的大概就是 联表查询之类的,update、delete语法本身不支持联表查询 但支持子查询update x set id=1 where id in(select id from x where xxxxx) 类似这样。
---- 补充几句话: jsqlparser才是重点,因为它能把sql转化成对象。有了结构化的sql之后你才能知道一个sql字符串想做什么。 由此,你在做缓存的时候才有地方下手。至于hql(?) 你也可以根据语法做点转换,虽然功能会弱。 如果你说你的实体的属性名和数据库表的字段名一致,不需要转换。即便如此也不表明你不需要jsqlparser,因为转换只不过是其中一个小功能,如果你要做缓存就必须有一个结构化的sql对象。如果不做缓存当然,你不需要这些东西。但是,sql语法仅仅能被数据库识别,你又能为你的系统做些什么?
最后,bug应该是少不不了的,这个需要更多的测试。如果你认为jsqlparser是个好东西,也可以研究下。
--11月22日更新查询缓存功能
替换掉了src,添加了缓存功能。把hibernatetest项目和freyjatest项目分开。
当我测试上面的查询功能的时候,开启hibernate查询缓存原本20秒的查询只需要2秒,当时我就震惊了。
但是等我为freyja添加上查询缓存功能的时候同样的方法只需要平均0.9秒,hibernate则平均2.4秒。 虽然说这种简单的测试说明不了什么(而且hibernate本身就不快),但是我觉得这对freyja来说是不错的开端。
查询缓存只限于单表查询的简单sql查询,因为我觉得复杂sql维护起来成本会加大,得不偿失就干脆这部分sql的效率提升直接依靠数据库。
希望有人能给一个其他框架的测试结果比较。使用查询缓存除了配置开启查询缓存之外,还需要在ehcache配置文件添加一个叫query_cache的缓存,暂时是这样后面我会改掉这点。jar都再lib1、2里面了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-11-17
不喜欢注解的路过
|
|
返回顶楼 | |
发表时间:2011-11-18
说明下,freyja不算是orm框架。因为其核心是sql
对于较为复杂的sql语句freyja不会对其处理,依靠数据库本身的能力来查询。 对于简单,如单表查询,单实体加载则通过缓存提高性能。 只有能被jsqlparser解析的sql才能处理,因为做缓存必须把sql结构化。好在jsqlparser支持的sql比较丰富能够被缓存处理的内容也很广。 |
|
返回顶楼 | |
发表时间:2011-11-18
最后修改:2011-11-18
自己玩玩还可以,至于实用性上吗。。。还是欠缺一些。
国产框架想要立足生根,要么海纳百川,如Nutz、bboss、jxva等,一物在手,开发无忧。 要么就剑走偏锋,如guzz、douyu等,在某一领域,有独门秘籍。 只有这样用户才愿意用,作者才有动力做下去。否则框架没人用,就真成了玩具。 继续加油,希望你成功。 |
|
返回顶楼 | |
发表时间:2011-11-18
最后修改:2011-11-18
个人非常反感“海纳百川” 而且freyja的特点已经很明确:专攻效率方面
为此取消了HQL语法支持等功能。把精力用来完善主功能上面。 至于维护,Freyja已经替代hibernate成为我们游戏框架的一部分。 |
|
返回顶楼 | |
发表时间:2011-11-18
aa87963014 写道 个人非常反感“海纳百川” 而且freyja的特点已经很明确:专攻效率方面
为此取消了HQL语法支持等功能。把精力用来完善主功能上面。 至于维护,Freyja已经替代hibernate成为我们游戏框架的一部分。 看看源码,看来我对你的框架理解有误,不是我想象的那样,根本就和nutz,guzz不是一个层面的框架,所以我不应该横向比较。你基本是封装springjdbctemplate模块,应该算是一个小改造。 你说你专攻效率方面,用map来缓存一下只能是将重复读取的效率提高了而已,而实际生产环境并不如你所愿,看看你的框架中丰富的jar,我只想说,这个框架效率的提升空间还是很大的。 |
|
返回顶楼 | |
发表时间:2011-11-18
最后修改:2011-11-18
本来就是封装了jdbctemplate,提升效率不是利用缓存还能有什么?给你一个map就能提升了么?
丰富的jar=ehcache+jsqlparser+el表达式+JdbcTemplate? 当然如果你觉得要我封装jdbc 自己写map做缓存 自己写javac解析sql 自己写el表达式解析sql表达式才能算一个层次的框架 我没话说。 不过我觉得能够很好的利用他们达到目的已经够了,这些jar工具在各自领域都很优秀了。 |
|
返回顶楼 | |
发表时间:2011-11-18
最好是用JPA的注释,这样以后换框架至少PO层可以重用,我自己也类似地写了一个,不过目的和你的不一样,我是为了实现SQL可配置化,另一方面利用freemarker支持动态SQL,这种工具就看自己的实际需求了。
不错,加油 |
|
返回顶楼 | |
发表时间:2011-11-18
最后修改:2011-11-18
就是动态SQL,模板语言+xml就可以实现了。
我用 velocity+dom4j+beanutils 写了个,ERP服务端框架一直在用它。缓存之类的就不用集成了,很多时候应用场景不同,策略也就不同。 深度的封装会造成后期应用很麻烦~ |
|
返回顶楼 | |
发表时间:2011-11-18
缓存本身就需要自己来做,不然做不好缓存。而且缓存的处理也是这类框架的自身特色
|
|
返回顶楼 | |