Hibernate获取数据的方式有不同的几种其与缓存结合使用的效果也不尽相同而Hibernate中具体 怎么使用缓存其实是我们很关心的一个问题直接涉及到性能方面
缓存在Hibernate中主要有三个方面一级缓存二级缓存和查询缓存一级缓存在Hibernate中对应 的即为session范围的缓存也就是当session关闭时缓存即被清除一级缓存在Hibernate中是不可配置 的部分二级缓存在Hibernate中对应的即为SessionFactory范围的缓存通常来讲SessionFactory的生 命周期和应用的生命周期相同所以可以看成是进程缓存或集群缓存二级缓存在Hibernate中是可以配 置的可以通过classcache配置类粒度级别的缓存(classcache在class中数据发生任何变化的情况下自 动更新)同时也可通过collectioncache配置集合粒度级别的缓存(collectioncache仅在collection中 增加了元素或者删除了元素的情况下才自动更新也就是当collection中元素发生值的变化的情况下它是 不会自动更新的)缓存自然会带来并发的访问问题这个时候相应的就要根据应用来设置缓存所采用的 事务隔离级别和数据库的事务隔离级别概念基本一样没什么多介绍的^_^查询缓存在Hibernate同 样是可配置的默认是关闭的可以通过设置cacheuse_query_cache为true来打开查询缓存根据缓存 的通常实现策略我们可以来理解Hibernate的这三种缓存缓存的实现通过是通过key/value的Map方式 来实现在Hibernate的一级二级和查询缓存也同样如此一级二级缓存使用的key均为po的主键ID value即为po实例对象查询缓存使用的则为查询的条件查询的参数查询的页数value有两种情况 如果采用的是select poproperty这样的方式那么value为整个结果集如采用的是from这样的方式那么 value为获取的结果集中各po对象的主键ID这样的作用很明显节省内存^_^
简单介绍完Hibernate的缓存后再结合Hibernate的获取数据方式来说明缓存的具体使用方式在 Hibernate中获取数据常用的方式主要有四种SessionloadSessiongetQuerylist erator
Sessionload
在执行sessionload时Hibernate首先从当前session的一级缓存中获取id对应的值在获取不到的 情况下将根据该对象是否配置了二级缓存来做相应的处理如配置了二级缓存则从二级缓存中获取id 对应的值如仍然获取不到则还需要根据是否配置了延迟加载来决定如何执行如未配置延迟加载则从数 据库中直接获取在从数据库获取到数据的情况下Hibernate会相应的填充一级缓存和二级缓存如配 置了延迟加载则直接返回一个代理类只有在触发代理类的调用时才进行数据库查询的操作
在这样的情况下我们就可以看到在session一直打开的情况下要注意在适当的时候对一级缓存进行 刷新操作通常是在该对象具有单向关联维护的时候在Hibernate中可以使用象sessionclear sessionevict的方式来强制刷新一级缓存
二级缓存则在数据发生任何变化(新增更新删除)的情况下都会自动的被更新
Sessionget
在执行Sessionget时和Sessionload不同的就是在当从缓存中获取不到时直接从数据库中获取id 对应的值
Querylist
在执行Querylist时Hibernate的做法是首先检查是否配置了查询缓存如配置了则从查询缓存中查 找key为查询语句+查询参数+分页条件的值如获取不到则从数据库中进行获取从数据库获取到后 Hibernate将会相应的填充一级二级和查询缓存如获取到的为直接的结果集则直接返回如获取到 的为一堆id的值则再根据id获取相应的值(Sessionload)最后形成结果集返回可以看到在这样的 情况下list也是有可能造成N次的查询的
查询缓存在数据发生任何变化的情况下都会被自动的清空
erator
在执行erator时和Querylist的不同的在于从数据库获取的处理上erator向数 据库发起的是select id from这样的语句也就是它是先获取符合查询条件的id之后在进行 iteratornext调用时才再次发起sessionload的调用获取实际的数据
可见在拥有二级缓存并且查询参数多变的情况下erator会比Querylist更为高效
这四种获取数据的方式都各有适用的场合要根据实际情况做相应的决定^_^最好的方式无疑就是 打开show_sql选项看看执行的情况来做分析系统结构上只用保证这种调整是容易实现的就好了在 cache这个方面的调整自然是非常的容易只需要调整配置文件里的设置而查询的方式则可对外部进行 屏蔽这样要根据实际情况调整也非常容易