服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

hibernate iterator jcs分析


  jcs是一个对象cache,它可以把java对象缓存起来,提高那些访问频率很高的java对象的存取效率。jcs是按照对象的唯一标示来存取对象的,比如说可以按照对象的hashcode来存取。

对于hibernate来说,可以利用jcs来缓存查询结果,这样当下次访问同样的数据,就无须去数据库取,直接从jcs中取出来,加快了查询速度。

当hibernate使用list或者iterator方式来第一次读取数据的时候,jcs是空的,此时不管是list方式还是iterator方式都会往jcs里面填充查询出来的持久对象,例如:

select c from cat as c



select c.id, c.name from cat as c

这种hql语句不构造po,因此不会去填充jcs。

好了,现在jcs里面填好了数据,但是该怎么取呢?上面我说过是按照对象的唯一标示来存取的,而对于po持久对象来说,唯一标示就是主键,因此hibernate首先必须获得主键列表,然后根据主键列表挨个判断,看这个持久对象究竟是在jcs里面还是在数据库里面,如果在jcs里面,那么按照主键取,如果在数据库,那么发送sql取。

现在我们来分析为什么iterator可以使用jcs,而list不能。上面说了,用jcs之前,要先获得持久对象的主键,才能去jcs里面取持久对象,而我们怎么才能获得主键列表呢?必须去数据库中取得,这一步是没有办法缓冲的。

hibernate iterator的查询本身是分为两步的:

==> select id from cat
==> select * from cat where id = ?
==> select * from cat where id = ?
...
==> select * from cat where id = ?

第一步,去数据库中取主键列表,第二步,按照主键一个一个取数据。当然了,我们现在可以看出来,iterator方式下如果不用jcs的话,那么从数据库中取出n条记录就需要n+1次sql查询,这是非常可怕的事情,因此如果在没有使用jcs的情况下,你又必须一次去取大量数据,应该避免使用iterator。

而iterator的第一次sql是取主键列表,这个时间消耗是非常少的,如果使用了jcs,那么每次查询仍然要不可避免的去发送一次sql: select id from cat 去取主键列表,然后呢? 然后iterator就不会那么傻了,他会先到jcs里面去看看,按照主键去找持久对象,如果有了,直接拿出来用,如果没有,那么只好去数据库中取得,然后再把它填到jcs里面去。

因此可以看出来,jcs有点类似一个内存中的简单对象数据库, iterator的第一次sql取主键列表是必须要到数据库里面取的,取得了主键这把钥匙以后,iterator会首先尝试开jcs这把锁,打得开就直接进去,如果打不开,就只好去开数据库这把锁了。

而hibernate list方式是jdbc的简单封装,一次sql就把所有的数据都取出来了,它不会像iterator那样先取主键,然后再取数据,因此list无法利用jcs。不过list也可以把从数据库中取出的数据填充到jcs里面去。

最佳的方式:第一次访问使用list,快速填充jcs,以后访问采用iterator,充分利用jcs。

mikeho write:

那jcs是如何和database保持同步的?

robbin write:

jcs.default.elementattributes.maxlifeseconds=240(最大缓冲时间)

超时做作废,另外你在程序里面也可以clear jcs cache

扫描关注微信公众号