This Domain(Admin5.com) is for Sale:

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网友发表了评论 查看完整内容

24小时热门信息