论坛首页 Java企业应用论坛

[轮子] FreyjaJdbcTemplate预览版(添加查询缓存功能)

浏览 9321 次
精华帖 (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里面了

   发表时间:2011-11-17  
不喜欢注解的路过
0 请登录后投票
   发表时间:2011-11-18  
说明下,freyja不算是orm框架。因为其核心是sql

对于较为复杂的sql语句freyja不会对其处理,依靠数据库本身的能力来查询。
对于简单,如单表查询,单实体加载则通过缓存提高性能。

只有能被jsqlparser解析的sql才能处理,因为做缓存必须把sql结构化。好在jsqlparser支持的sql比较丰富能够被缓存处理的内容也很广。
0 请登录后投票
   发表时间:2011-11-18   最后修改:2011-11-18
自己玩玩还可以,至于实用性上吗。。。还是欠缺一些。
国产框架想要立足生根,要么海纳百川,如Nutz、bboss、jxva等,一物在手,开发无忧。
要么就剑走偏锋,如guzz、douyu等,在某一领域,有独门秘籍。
只有这样用户才愿意用,作者才有动力做下去。否则框架没人用,就真成了玩具。
继续加油,希望你成功。
0 请登录后投票
   发表时间:2011-11-18   最后修改:2011-11-18
个人非常反感“海纳百川” 而且freyja的特点已经很明确:专攻效率方面

为此取消了HQL语法支持等功能。把精力用来完善主功能上面。

至于维护,Freyja已经替代hibernate成为我们游戏框架的一部分。
0 请登录后投票
   发表时间:2011-11-18  
aa87963014 写道
个人非常反感“海纳百川” 而且freyja的特点已经很明确:专攻效率方面

为此取消了HQL语法支持等功能。把精力用来完善主功能上面。

至于维护,Freyja已经替代hibernate成为我们游戏框架的一部分。

看看源码,看来我对你的框架理解有误,不是我想象的那样,根本就和nutz,guzz不是一个层面的框架,所以我不应该横向比较。你基本是封装springjdbctemplate模块,应该算是一个小改造。
你说你专攻效率方面,用map来缓存一下只能是将重复读取的效率提高了而已,而实际生产环境并不如你所愿,看看你的框架中丰富的jar,我只想说,这个框架效率的提升空间还是很大的。
0 请登录后投票
   发表时间:2011-11-18   最后修改:2011-11-18
本来就是封装了jdbctemplate,提升效率不是利用缓存还能有什么?给你一个map就能提升了么?

丰富的jar=ehcache+jsqlparser+el表达式+JdbcTemplate?

当然如果你觉得要我封装jdbc 自己写map做缓存 自己写javac解析sql 自己写el表达式解析sql表达式才能算一个层次的框架 我没话说。

不过我觉得能够很好的利用他们达到目的已经够了,这些jar工具在各自领域都很优秀了。
0 请登录后投票
   发表时间:2011-11-18  
最好是用JPA的注释,这样以后换框架至少PO层可以重用,我自己也类似地写了一个,不过目的和你的不一样,我是为了实现SQL可配置化,另一方面利用freemarker支持动态SQL,这种工具就看自己的实际需求了。
不错,加油
0 请登录后投票
   发表时间:2011-11-18   最后修改:2011-11-18
就是动态SQL,模板语言+xml就可以实现了。
我用 velocity+dom4j+beanutils 写了个,ERP服务端框架一直在用它。缓存之类的就不用集成了,很多时候应用场景不同,策略也就不同。
深度的封装会造成后期应用很麻烦~
0 请登录后投票
   发表时间:2011-11-18  
缓存本身就需要自己来做,不然做不好缓存。而且缓存的处理也是这类框架的自身特色
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics