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

news/2024/7/9 22:20:20 标签: hibernate, cache, 数据库, session, query, 集群

 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这个方面调整自然是非常容易只需要调整配置文件里设置而查询方式则可对外部进行屏蔽这样要根据实际情况调整也非常容易


http://www.niftyadmin.cn/n/1051119.html

相关文章

codeforces CF981C Useful Decomposition 菊花图性质

$ \rightarrow $ 戳我看CF原题 C. Useful Decompositiontime limit per test: 1 secondmemory limit per test: 256 megabytesinput: standard inputoutput: standard outputRamesses knows a lot about problems involving trees (undirected connected graphs without cycles…

蓝桥杯 ADV-223 因式分解

蓝桥杯 ADV-223 因式分解 问题描述 设计算法,用户输入合数,程序输出若个素数的乘积。例如,输入6,输出2*3。输入20,输出2*2*5。 输入样例 120 输出样例 2*2*2*3*5 思路解析 筛选出5000内的素数,从头到尾…

LaTeX公式中的空格

两个quad空格a \qquad b两个m的宽度quad空格a \quad b一个m的宽度大空格a\ b1/3m宽度中等空格a\;b2/7m宽度小空格a\,b1/6m宽度没有空格ab 紧贴a\!b缩进1/6m宽度转载于:https://www.cnblogs.com/lzhu/p/9044227.html

hibernate二级缓存:hibernate3 2级缓存Cache的配置及测试

1.配置ehcache.xml文件放到path下: <?xml version"1.0" encoding"GBK"?>   <ehcache>       <diskStore path"D:TempObject"/>       <defaultCache            maxElementsInMemory"10…

[译]Ocelot - Tracing

原文 Ocelot是使用的Butterfly这个项目来实现这个的。 在ocelot要使用tracing&#xff0c; 首先得安装相应的包&#xff1a; Install-Package Ocelot.Tracing.Butterfly 然后再ConfigureServices方法里面添加如下代码&#xff1a; services.AddOcelot()// 下面这个扩展方法来自…

蓝桥杯 ADV-222 求arccos

蓝桥杯 ADV-222 求arccos 问题描述 利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数&#xff0c;x取值范围是[-1, 1]&#xff0c;返回值为[0, PI]。要求结果准确到小数点后5位。(PI 3.1415926) 提示&#xff1a;要达到这种程度的精度需要使用double类型。 样例输入 0.5…

简化mybatis的使用方式:通用插件JpaMapper之PagingAndSortingMapper

简化mybatis的使用方式&#xff1a;通用插件JpaMapper之PagingAndSortingMapper 简介 JpaMapper以Jpa hibernate的风格写mybatis的代码&#xff0c;可以减少手动写sql的烦恼。 PagingAndSortingMapper可以实现带分页和排序的增删改查&#xff0c;简化mybatis的使用。 这里介…

hibernate二级缓存:hibernate3学习笔记( 2十一)| 2级缓存Cache

2级缓存Cache及外部缓存Cache它能够越过数个Session通过同个SessionFactory进行管理和维护 接上例代码:http://blog.csdn.net/kunshan_shenbin/archive/2008/09/03/2874375.aspx 要使用 2级缓存Cache首先需要对hibernate.cfg.xml文件进行修改: <?xmlversion"1.0&quo…