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

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

推荐三篇关于Hibernate缓存机制介绍的文章:
http://gocom.primeton.com/blog/index.php?op=ViewArticle&articleId=467&blogId=37&src=jdon&srcforum=62
http://club.gamvan.com/club/clubPage.jsp?ccStyle=0&tID=10456&ccID=37
http://www.devx.com/dbzone/Article/29685/1954?pf=true

转载于:https://www.cnblogs.com/panjun-Donet/archive/2010/07/31/1789285.html

Hibernate获取数据方式与缓存使用相关推荐

  1. 如何获取大端中的数据_【软件】ProE中各种获取数据方式的区别

    更多精彩,请点击上方蓝字关注我们! 软件 ProE中各种获取数据方式的区别 输入特征:输入特征是通过数据共享功能从外部文件输入几何的,文件输入以后,会转换成proe软件能够识别的几何,称为一个特征发布 ...

  2. .net中如何同步获取数据方式增加一样数据自动刷新列表_知客CRM如何对接微信公众号...

    如果您的企业正在运营微信公众号,您可以将公众号上的粉丝和知客CRM中的客户信息进行身份绑定,这样公众号的粉丝就有了一个客户ID,能够与CRM系统进行业务交互,比如浏览公司产品.下单到CRM.发起投诉流 ...

  3. .net中如何同步获取数据方式增加一样数据自动刷新列表_期待已久的动态数据库工具终于来了!...

    本地数据库的创建和管理是大多数移动应用工程中的核心组件之一,一般会通过直接使用 SQLite 或 Jetpack Room 持久化库来完成.开发者们也在不断地寻求着更好的方式,使其能够在运行中的应用中 ...

  4. Hibernate获取数据java.lang.StackOverflowError

    原因:因为在重写toString()方法时,把关联的属性也放入到toString方法中了,去掉就可以了. 如:重写的toString方法中不能有关联关系IDCard属性idCard public cl ...

  5. hbase-client1.2.0新版api获取数据方式

    public static void QueryAll(String tableName) {try {Table table = connection.getTable(TableName.valu ...

  6. img标签 三种获取数据方式

    1.通过静态文件加载 <img src="./test.png"> 2.通过字节传递二进制图片文件 from jinja2 import Template,FileSy ...

  7. usestate中的回调函数_React 中获取数据的 3 种方法:哪种最好?

    译文 | https://cloud.tencent.com/developer/article/1535913 原文 | https://dmitripavlutin.com/ 在执行 I/O 操作 ...

  8. php缓存远程图片接口,Android_Android远程获取图片并本地缓存,对于客户端——服务器端应用 - phpStudy...

    Android远程获取图片并本地缓存 对于客户端--服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量,对应用来说,如果处理不好这个问题,那会让用户很崩溃,不知不觉手 ...

  9. Python量化入门系列:获取数据-Tushare获取股票数据(1)

    做量化用到的数据一般包括二级市场各种数据.宏观经济各种数据以及一些特殊需求的网页数据,需要有通过python获取数据.常见的获取数据方式有三种: 一是通过SQL语言从数据库获取数据,适用于二级市场和宏 ...

最新文章

  1. J2SE基础夯实系列之数组
  2. 【C++】【十二】排序实现及思路
  3. html特殊文字效果,HTML几个特殊的属性标签的使用介绍
  4. 【C++ Primer | 16】std::move和std::forward、完美转发
  5. su su - sudo
  6. Linux服务器性能优化
  7. mysql 聚集函数 count 使用详解
  8. Ubuntu MPEG-4 AAC 与 H.264 解码器安装
  9. Visio 画流程图 入门
  10. iOS--视频播放器之ZFPlayer
  11. Java学习心得(集合、泛型)
  12. pyhanlp 实体命名识别
  13. Imazing2023免费版苹果手机iOS数据管理软件
  14. mysql 有等待事件,排查性能详情中活动会话正在 SYNCH 等待事件状态下等待的问题...
  15. 汇编语言,大写字母转换为小写
  16. MNN实践[C++版本]
  17. C++ 中父类与子类赋值,取地址,引用的理解关系
  18. 3D打印设备的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. 人人都想自学python_人人都想自学编程,为什么坚持下来的没几个?
  20. ArcGIS环境搭建及地图服务发布

热门文章

  1. 关于JSTL的简单说明
  2. It's my life
  3. 本地创建多个ssh-key
  4. RN性能优化以及事件监听
  5. 前端性能优化之缓存技术
  6. JavaScript数据结构——队列(Queue)
  7. 我是真的傻,她被超市安保罚了100元,我居然给她50元
  8. 月薪五万挖过来的高管第二天就离职了,为何公司总留不住优秀人才?
  9. 有没有妈妈生了孩子一点不像自己的,觉得亏吗?
  10. 作为一个生鲜电商自媒体