hibernate缓存:Hibernate获取数据方式和缓存Cache使用

来源:互联网 发布:google play软件下载 编辑:程序博客网 时间:2024/05/21 17:54

 Hibernate获取数据方式有区别几种其和缓存Cache结合使用效果也不尽相同而Hibernate中具体如何使用缓存Cache其实是我们很关心个问题直接涉及到性能方面

  缓存Cache在Hibernate中主要有 3个方面:级缓存Cache、 2级缓存Cache和查询缓存Cache;级缓存Cache在Hibernate中对应即为session范围缓存Cache也就是当session关闭时缓存Cache即被清除级缓存Cache在Hibernate中是不可配置部分; 2级缓存Cache在Hibernate中对应即为SessionFactory范围缓存Cache通常来讲SessionFactory生命周期和应用生命周期相同所以可以看成是进程缓存Cache或集群缓存Cache 2级缓存Cache在Hibernate中是可以配置可以通过-cache配置类粒度级别缓存Cache(-cache在中数据发生任何变化情况下自动更新)同时也可通过collection-cache配置集合粒度级别缓存Cache(collection-cache仅在collection中增加了元素或者删除了元素情况下才自动更新也就是当collection中元素发生值变化情况下它是不会自动更新)缓存Cache自然会带来并发访问问题这个时候相应就要根据应用来设置缓存Cache所采用事务隔离级别和数据库事务隔离级别概念基本样没什么多介绍^_^;查询缓存Cache在Hibernate同样是可配置默认是关闭可以通过设置cache.use_query_cache为true来打开查询缓存Cache根据缓存Cache通常实现策略我们可以来理解Hibernate这 3种缓存Cache缓存Cache实现通过是通过key/valueMap方式来实现在Hibernate级、 2级和查询缓存Cache也同样如此级、 2级缓存Cache使用key均为po主键IDvalue即为po例子对象查询缓存Cache使用则为查询条件、查询参数、查询页数value有两种情况如果采用是select po.property这样方式那么value为整个结果集如采用是from这样方式那么value为获取结果集中各po对象主键ID这样作用很明显节省内存^_^

  简单介绍完Hibernate缓存Cache后再结合Hibernate获取数据方式来介绍说明缓存Cache具体使用方式在Hibernate中获取数据常用方式主要有 4种:Session.load、Session.get、Query.list、Query.iterator

  1、Session.load

  在执行session.load时Hibernate首先从当前session级缓存Cache中获取id对应值在获取不到情况下将根据该对象是否配置了 2级缓存Cache来做相应处理如配置了 2级缓存Cache则从 2级缓存Cache中获取id对应值如仍然获取不到则还需要根据是否配置了延迟加载来决定如何执行如未配置延迟加载则从数据库中直接获取在从数据库获取到数据情况下Hibernate会相应填充级缓存Cache和 2级缓存Cache如配置了延迟加载则直接返回个代理类只有在触发代理类时才进行数据库查询操作

  在这样情况下我们就可以看到在session直打开情况下要注意在适当时候对级缓存Cache进行刷新操作通常是在该对象具有单向关联维护时候在Hibernate中可以使用象session.clear、session.evict方式来强制刷新级缓存Cache

   2级缓存Cache则在数据发生任何变化(新增、更新、删除)情况下都会自动被更新

  2、Session.get

  在执行Session.get时和Session.load区别就是在当从缓存Cache中获取不到时直接从数据库中获取id对应值

  3、Query.list

  在执行Query.list时Hibernate做法是首先检查是否配置了查询缓存Cache如配置了则从查询缓存Cache中查找key为查询语句+查询参数+分页条件值如获取不到则从数据库中进行获取从数据库获取到后Hibernate将会相应填充级、 2级和查询缓存Cache如获取到为直接结果集则直接返回如获取到为堆id值则再根据id获取相应值(Session.load)最后形成结果集返回可以看到在这样情况下list也是有可能造成N次查询

  查询缓存Cache在数据发生任何变化情况下都会被自动清空

  4、Query.iterator

  在执行Query.iterator时和Query.list区别在于从数据库获取处理上Query.iterator向数据库发起是select id from这样语句也就是它是先获取符合查询条件id的后在进行iterator.next时才再次发起session.load获取实际数据

  可见在拥有 2级缓存Cache并且查询参数多变情况下Query.iterator会比Query.list更为高效

  这 4种获取数据方式都各有适用场合要根据实际情况做相应决定^_^最好方式无疑就是打开show_sql选项看看执行情况来做分析系统结构上只用保证这种调整是容易实现就好了在cache这个方面调整自然是非常容易只需要调整配置文件里设置而查询方式则可对外部进行屏蔽这样要根据实际情况调整也非常容易