Hibernate和Jive缓存策略的比较
时间:2007-12-27 来源:不详 作者:林子
3.Hibernate二级缓存策略的缺点:
(1)同Jive缓存策略的第(1)条缺点一样,条件查询的时候,第(1)步的数据库查询语句是不可少的。而且Hibernate选择所有的字段,比只选择ID字段花费的时间和空间都多。
(2)不具备Jive缓存策略的第(2)条优点。条件查询的时候,必须把数据库对象从数据库中整个取出,即使该数据库的ID已经存在于缓存中。
Hibernate的Query缓存策略
可以看到,Jive缓存和Hibernate的二级缓存策略,都只是针对于ID查询的缓存策略,对于条件查询则毫无作用。(尽管Jive缓存的第(2)个优点,能够避免重复从数据库获取同一个ID对应的数据对象,但selectidfrom…这条数据库查询是每次条件查询都必不可少的)。
为此,Hibernate提供了针对条件查询的Query缓存。 织梦内容管理系统
1.Hibernate的Query缓存策略的过程描述:
(1)条件查询的请求一般都包括如下信息:SQL,SQL需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows),等。
(2)Hibernate首先根据这些信息组成一个QueryKey,根据这个QueryKey到Query缓存中查找对应的结果列表。假如存在,那么返回这个结果列表;假如不存在,查询数据库,获取结果列表,把整个结果列表根据QueryKey放入到Query缓存中。
(3)QueryKey中的SQL涉及到一些表名,假如这些表的任何数据发生修改、删除、增加等操作,这些相关的QueryKey都要从缓存中清空。
2.Hibernate的Query缓存策略的优点
(1)条件查询的时候,假如QueryKey已经存在于缓存,那么不需要再查询数据库。命中的情况下,一次数据库查询也不需要。
3.Hibernate的Query缓存策略的缺点
(1)条件查询涉及到的表中,假如有任何一条记录增加、删除、或改变,那么缓存中所有和该表相关的QueryKey都会失效。
比如,有这样几组QueryKey,它们的SQL里面都包括table1。
SQL=select*fromtable1wherec1=?….,parameter=1,rowStart=11,maxRows=20.
dedecms.com
SQL=select*fromtable1wherec1=?….,parameter=1,rowStart=21,maxRows=20.
SQL=select*fromtable1wherec1=?…..,parameter=2,rowStart=11,maxRows=20.
SQL=select*fromtable1wherec1=?…..,parameter=2,rowStart=11,maxRows=20.
SQL=select*fromtable1wherec2=?….,parameter=‘abc’,rowStart=11,maxRows=20.
当table1的任何数据对象(任何字段)改变、增加、删除的时候,这些QueryKey对应的结果集都不能保证没有发生变化。很难做到根据数据对象的改动精确判定哪些QueryKey对应的结果集受到影响。最简单的实现方法,就是清空所有SQL包含table1的QueryKey。
(2)Query缓存中,QueryKey对应的是数据对象列表,假如不同的QueryKey对应的数据对象列表有交集,那么,交集部分的数据对象就是重复存储的。
比如,QueryKey1对应的数据对象列表为{a(id=1),b(id=2)},QueryKey2对应的数据对象列表为{a(id=1),c(id=3)},这个a就在两个List同时存在了两份。
4.二级缓存和Query缓存同步的困惑
假如,Query缓存中,一个QueryKey对应的结果列表为{a(id=1),b(id=2),c(id=3)};二级缓存里面有也id=1对应的数据对象a。
这两个数据对象a之间是什么关系?能够保持状态同步吗?我阅读Hibernate的相关源码,没有发现两个缓存之间的这种同步关系。或者两者之间毫无关系。就像我上面所说的,只要表数据发生变化,相关的QueryKey都要被清空。所以不用考虑同步问题。 织梦好,好织梦
文章评论
共有位Admini5网友发表了评论 查看完整内容