hibernate二级缓存更新(如何获取hibernate的二级缓存)

2024-08-26 22:35:03 3

hibernate二级缓存更新(如何获取hibernate的二级缓存)

各位老铁们好,相信很多人对hibernate二级缓存更新都不是特别的了解,因此呢,今天就来为大家分享下关于hibernate二级缓存更新以及如何获取hibernate的二级缓存的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

本文目录

如何获取hibernate的二级缓存

二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehcache、oscache等,需要设置hibernate.cache.provider_class,我们这里用ehcache,在2.1中就是 hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider 如果使用查询缓存,加上 hibernate.cache.use_query_cache=true 缓存可以简单的看成一个Map,通过key在缓存里面找value。 Class的缓存 对于一条记录,也就是一个PO来说,是根据ID来找的,缓存的key就是ID,value是POJO。无论list,load还是iterate,只要读出一个对象,都会填充缓存。但是list不会使用缓存,而iterate会先取数据库select id出来,然后一个id一个id的load,如果在缓存里面有,就从缓存取,没有的话就去数据库load。假设是读写缓存,需要设置: 《cache usage="read-write"/》 如果你使用的二级缓存实现是ehcache的话,需要配置ehcache.xml 《cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" /》 其中eternal表示缓存是不是永远不超时,timeToLiveSeconds是缓存中每个元素(这里也就是一个POJO)的超时时间,如果eternal="false",超过指定的时间,这个元素就被移走了。timeToIdleSeconds是发呆时间,是可选的。当往缓存里面put的元素超过500个时,如果overflowToDisk="true",就会把缓存中的部分数据保存在硬盘上的临时文件里面。 每个需要缓存的class都要这样配置。如果你没有配置,hibernate会在启动的时候警告你,然后使用defaultCache的配置,这样多个class会共享一个配置。 当某个ID通过hibernate修改时,hibernate会知道,于是移除缓存。 这样大家可能会想,同样的查询条件,第一次先list,第二次再iterate,就可以使用到缓存了。实际上这是很难的,因为你无法判断什么时候是第一次,而且每次查询的条件通常是不一样的,假如数据库里面有100条记录,id从1到100,第一次list的时候出了前50个id,第二次iterate的时候却查询到30至70号id,那么30-50是从缓存里面取的,51到70是从数据库取的,共发送1+20条sql。所以我一直认为iterate没有什么用,总是会有1+N的问题。 (题外话:有说法说大型查询用list会把整个结果集装入内存,很慢,而iterate只select id比较好,但是大型查询总是要分页查的,谁也不会真的把整个结果集装进来,假如一页20条的话,iterate共需要执行21条语句,list虽然选择若干字段,比iterate第一条select id语句慢一些,但只有一条语句,不装入整个结果集hibernate还会根据数据库方言做优化,比如使用mysql的limit,整体看来应该还是list快。) 如果想要对list或者iterate查询的结果缓存,就要用到查询缓存了 查询缓存 首先需要配置hibernate.cache.use_query_cache=true 如果用ehcache,配置ehcache.xml,注意hibernate3.0以后不是net.sf的包名了 《cache name="net.sf.hibernate.cache.StandardQueryCache"maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"timeToLiveSeconds="7200" overflowToDisk="true"/》 《cache name="net.sf.hibernate.cache.UpdateTimestampsCache"maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/》 然后 query.setCacheable(true);//激活查询缓存 query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion,可选 第二行指定要使用的cacheRegion是myCacheRegion,即你可以给每个查询缓存做一个单独的配置,使用setCacheRegion来做这个指定,需要在ehcache.xml里面配置它: 《cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /》 如果省略第二行,不设置cacheRegion的话,那么会使用上面提到的标准查询缓存的配置,也就是net.sf.hibernate.cache.StandardQueryCache 对于查询缓存来说,缓存的key是根据hql生成的sql,再加上参数,分页等信息(可以通过日志输出看到,不过它的输出不是很可读,最好改一下它的代码)。 比如hql: from Cat c where c.name like ? 生成大致如下的sql: select * from cat c where c.name like ? 参数是"tiger%",那么查询缓存的key*大约*是这样的字符串(我是凭记忆写的,并不精确,不过看了也该明白了): select * from cat c where c.name like ? , parameter:tiger% 这样,保证了同样的查询、同样的参数等条件下具有一样的key。 现在说说缓存的value,如果是list方式的话,value在这里并不是整个结果集,而是查询出来的这一串ID。也就是说,不管是list方法还是iterate方法,第一次查询的时候,它们的查询方式很它们平时的方式是一样的,list执行一条sql,iterate执行1+N条,多出来的行为是它们填充了缓存。但是到同样条件第二次查询的时候,就都和iterate的行为一样了,根据缓存的key去缓存里面查到了value,value是一串id,然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。 可以看出来,查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候,都是既填充查询缓存又填充class缓存的。 这里还有一个很容易被忽视的重要问题,即打开查询缓存以后,即使是list方法也可能遇到1+N的问题!相同条件第一次list的时候,因为查询缓存中找不到,不管class缓存是否存在数据,总是发送一条sql语句到数据库获取全部数据,然后填充查询缓存和class缓存。但是第二次执行的时候,问题就来了,如果你的class缓存的超时时间比较短,现在class缓存都超时了,但是查询缓存还在,那么list方法在获取id串以后,将会一个一个去数据库load!因此,class缓存的超时时间一定不能短于查询缓存设置的超时时间!如果还设置了发呆时间的话,保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况,比如class缓存被程序强制evict了,这种情况就请自己注意了。 另外,如果hql查询包含select字句,那么查询缓存里面的value就是整个结果集了。 当hibernate更新数据库的时候,它怎么知道更新哪些查询缓存呢? hibernate在一个地方维护每个表的最后更新时间,其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配置里面。 当通过hibernate更新的时候,hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表,当hibernate查询一个缓存是否存在的时候,如果缓存存在,它还要取出缓存的生成时间和这个缓存所查询的表,然后去查找这些表的最后更新时间,如果有一个表在生成时间后更新过了,那么这个缓存是无效的。 可以看出,只要更新过一个表,那么凡是涉及到这个表的查询缓存就失效了,因此查询缓存的命中率可能会比较低。 Collection缓存 需要在hbm的collection里面设置 《cache usage="read-write"/》 假如class是Cat,collection叫children,那么ehcache里面配置 《cache name="com.xxx.pojo.Cat.children"maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200"overflowToDisk="true" /》 Collection的缓存和前面查询缓存的list一样,也是只保持一串id,但它不会因为这个表更新过就失效,一个collection缓存仅在这个collection里面的元素有增删时才失效。 这样有一个问题,如果你的collection是根据某个字段排序的,当其中一个元素更新了该字段时,导致顺序改变时,collection缓存里面的顺序没有做更新。 缓存策略 只读缓存(read-only):没有什么好说的 读/写缓存(read-write):程序可能要的更新数据 不严格的读/写缓存(nonstrict-read-write):需要更新数据,但是两个事务更新同一条记录的可能性很小,性能比读写缓存好 事务缓存(transactional):缓存支持事务,发生异常的时候,缓存也能够回滚,只支持jta环境,这个我没有怎么研究过 读写缓存和不严格读写缓存在实现上的区别在于,读写缓存更新缓存的时候会把缓存里面的数据换成一个锁,其他事务如果去取相应的缓存数据,发现被锁住了,然后就直接取数据库查询。 在hibernate2.1的ehcache实现中,如果锁住部分缓存的事务发生了异常,那么缓存会一直被锁住,直到60秒后超时。 不严格读写缓存不锁定缓存中的数据。 使用二级缓存的前置条件 你的hibernate程序对数据库有独占的写访问权,其他的进程更新了数据库,hibernate是不可能知道的。你操作数据库必需直接通过hibernate,如果你调用存储过程,或者自己使用jdbc更新数据库,hibernate也是不知道的。hibernate3.0的大批量更新和删除是不更新二级缓存的,但是据说3.1已经解决了这个问题。 这个限制相当的棘手,有时候hibernate做批量更新、删除很慢,但是你却不能自己写jdbc来优化,很郁闷吧。 SessionFactory也提供了移除缓存的方法,你一定要自己写一些JDBC的话,可以调用这些方法移除缓存,这些方法是: void evict(Class persistentClass)Evict all entries from the second-level cache. void evict(Class persistentClass, Serializable id)Evict an entry from the second-level cache. void evictCollection(String roleName)Evict all entries from the second-level cache. void evictCollection(String roleName, Serializable id)Evict an entry from the second-level cache. void evictQueries()Evict any query result sets cached in the default query cache region. void evictQueries(String cacheRegion)Evict any query result sets cached in the named query cache region. 不过我不建议这样做,因为这样很难维护。比如你现在用JDBC批量更新了某个表,有3个查询缓存会用到这个表,用evictQueries(String cacheRegion)移除了3个查询缓存,然后用evict(Class persistentClass)移除了class缓存,看上去好像完整了。不过哪天你添加了一个相关查询缓存,可能会忘记更新这里的移除代码。如果你的jdbc代码到处都是,在你添加一个查询缓存的时候,还知道其他什么地方也要做相应的改动吗? ---------------------------------------------------- 总结: 不要想当然的以为缓存一定能提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的,不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用,可能会有1+N的问题。不当的使用还可能导致读出脏数据。 如果受不了hibernate的诸多限制,那么还是自己在应用程序的层面上做缓存吧。 在越高的层面上做缓存,效果就会越好。就好像尽管磁盘有缓存,数据库还是要实现自己的缓存,尽管数据库有缓存,咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么,只能做的比较通用,而高层可以有针对性的实现缓存,所以在更高的级别上做缓存,效果也要好些吧。

hibernate机制 保存数据时报 ‘已生成用于更新的结果集’ 求大神指教

一、 在session的内部缓存中寻找保存对象,如果找到了,则认为此数据已经保存(曾经执行过insert操作),实体对象已经处于persistent状态,直接返回。此时即使数据相比之前的状态发生了变化,也将在事务提交时由脏数据检查来判定是否需要执行update操作。二、 如果实体对象实现了lifecycle接口,那么将执行待保存对象的onSave()方法。三、 如果实体对象实现了Validatable接口,那么将会执行相应的validate()方法。四、 如果存在拦截器对象,那么将会执行Interceptor.onSave()方法。五、 构造insert SQL语句完成数据保存。六、 数据保存成功后,设定实体对象的id为插入记录的id。七、 将保存后的实体对象纳入Hibernate的内部缓存(一级缓存)。注意Hibernate不会把保存后的实体对象纳入二级缓存,因为刚刚保存过的实体对象很可能在之后被修改,缓存的频繁更新以及带来的同步问题代价,超出了缓存该对象所带来的收益。八、 最后如果该对象有关联对象,那么将会递归处理该级联对象。

OK,关于hibernate二级缓存更新和如何获取hibernate的二级缓存的内容到此结束了,希望对大家有所帮助。

hibernate二级缓存更新(如何获取hibernate的二级缓存)

本文编辑:admin

更多文章:


msn还有人用吗(msn现在还有人用吗)

msn还有人用吗(msn现在还有人用吗)

大家好,关于msn还有人用吗很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于msn现在还有人用吗的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录msn现

2024年5月10日 05:02

360桌面最新版本下载(360可以下载通软安全桌面吗)

360桌面最新版本下载(360可以下载通软安全桌面吗)

大家好,如果您还对360桌面最新版本下载不太了解,没有关系,今天就由本站为大家分享360桌面最新版本下载的知识,包括360可以下载通软安全桌面吗的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录360可以下载通软安全

2024年7月28日 22:35

地下城与勇士手游官方(地下城与勇士手游到底哪个是官方的)

地下城与勇士手游官方(地下城与勇士手游到底哪个是官方的)

大家好,关于地下城与勇士手游官方很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于地下城与勇士手游到底哪个是官方的的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2024年9月1日 06:45

vivo边缘闪光怎么设置?oppo跑马灯边缘闪光怎么设置

vivo边缘闪光怎么设置?oppo跑马灯边缘闪光怎么设置

本文目录vivo边缘闪光怎么设置oppo跑马灯边缘闪光怎么设置oppo边缘闪光灯怎么设置iphone边缘闪光怎么弄三星s9屏幕边缘闪光怎么弄来电oppo手机屏幕边缘闪光vivo边缘闪光怎么设置在桌面找到【设置】并且点击进入。往下滑动找到【更

2024年5月15日 20:49

联想昭阳e200(联想昭阳e200内存升级问题)

联想昭阳e200(联想昭阳e200内存升级问题)

本文目录联想昭阳e200内存升级问题联想昭阳e200怎么改光盘启动联想昭阳E200开机黑屏联想昭阳笔记本电脑E200内存怎么升级可以升到多大我的联想昭阳E200想最大限度提升性能,能升级到什么样联想 昭阳 E200 电流大 故障联想昭阳E2

2024年7月24日 15:22

OPPO手机送的会员卡有什么用?大家说的手机会员卡是什么怎么用的

OPPO手机送的会员卡有什么用?大家说的手机会员卡是什么怎么用的

本文目录OPPO手机送的会员卡有什么用大家说的手机会员卡是什么怎么用的大王超级会员卡微信电子会员卡怎么弄oppo会员卡有哪些特权手机会员是啥意思啊电子会员卡是怎么用的啊手机会员卡如何使用与积分OPPO手机送的会员卡有什么用摘要您好,如果您体

2024年5月28日 04:15

鸟人助手官网下载(和平精英透视怎么下载)

鸟人助手官网下载(和平精英透视怎么下载)

大家好,如果您还对鸟人助手官网下载不太了解,没有关系,今天就由本站为大家分享鸟人助手官网下载的知识,包括和平精英透视怎么下载的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录和平精英透视怎么下载倩女幽魂挂机软件哪个好

2024年6月26日 20:55

嗅探浏览器插件使用?火狐浏览器怎么使用嗅探器

嗅探浏览器插件使用?火狐浏览器怎么使用嗅探器

大家好,今天小编来为大家解答以下的问题,关于嗅探浏览器,嗅探浏览器插件使用这个很多人还不知道,现在让我们一起来看看吧!本文目录嗅探浏览器插件使用火狐浏览器怎么使用嗅探器嗅探浏览器等含义相似浏览器嗅探功能是什么vivo手机浏览器资源嗅探怎么关

2024年7月27日 01:01

罪恶都市侠盗猎车手(侠盗飞车罪恶都市秘籍(要全的))

罪恶都市侠盗猎车手(侠盗飞车罪恶都市秘籍(要全的))

这篇文章给大家聊聊关于罪恶都市侠盗猎车手,以及侠盗飞车罪恶都市秘籍(要全的)对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录侠盗飞车罪恶都市秘籍(要全的)侠盗猎车手罪恶都市所有秘籍侠盗猎车手圣安地列斯和罪恶都市是第几部侠盗猎车

2024年7月24日 05:50

宏基4750zg(宏基4750zg笔记本的内存条是几代的加个1g内存条要多少钱)

宏基4750zg(宏基4750zg笔记本的内存条是几代的加个1g内存条要多少钱)

本文目录宏基4750zg笔记本的内存条是几代的加个1g内存条要多少钱宏基笔记本4750ZG可以换显卡吗宏基4750ZG玩CS怎么样卡不卡请问我的宏基4750zg总程序无法响应是哪出问题了宏基4750zg笔记本的内存条是几代的加个1g内存条要

2024年6月2日 19:57

杜康指的是什么意思(杜康的意思是什么)

杜康指的是什么意思(杜康的意思是什么)

本文目录杜康的意思是什么杜康指什么杜康是什么意思杜康的意思是什么   清陈维崧《满江红·闻阮亭罢官之信并寄西樵》词:“使渐离和曲,杜康佐酿。”下面是我为大家整理的杜康的意思是什么,希望对大家有帮助!   杜康的意思  

2024年5月19日 02:26

聚合支付平台官网(聚合支付有哪些平台)

聚合支付平台官网(聚合支付有哪些平台)

其实聚合支付平台官网的问题并不复杂,但是又很多的朋友都不太了解聚合支付有哪些平台,因此呢,今天小编就来为大家分享聚合支付平台官网的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录聚合支付有哪些平台个人怎么开通聚合支

2024年6月30日 06:05

奥特曼模拟器游戏下载(奥特曼模拟器怎么更新)

奥特曼模拟器游戏下载(奥特曼模拟器怎么更新)

各位老铁们,大家好,今天由我来为大家分享奥特曼模拟器游戏下载,以及奥特曼模拟器怎么更新的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录奥特曼模拟器怎

2024年6月20日 10:35

网上商城系统(目前网上商城系统哪个好用)

网上商城系统(目前网上商城系统哪个好用)

本文目录目前网上商城系统哪个好用网上商城系统有哪些个呢哪个网店系统最好网上商城系统开发的方式有哪些哪个网上商城系统最好呢哪个好呢java网上商城系统相比其他的系统有什么优势吗自己想搭建网上商城系统,大概需要多少钱目前网上商城系统哪个好用为了

2024年3月11日 04:25

扑飞漫画官网(扑飞漫画官网怎么没了)

扑飞漫画官网(扑飞漫画官网怎么没了)

这篇文章给大家聊聊关于扑飞漫画官网,以及扑飞漫画官网怎么没了对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录扑飞漫画官网怎么没了扑飞漫画改名了吗扑飞漫画下载的安装包在哪扑飞漫画怎么更新不了校园风云录漫画在哪看扑飞漫画倒闭了吗求

2024年6月18日 08:53

视频转换器格式工厂(格式工厂怎么转换mp4)

视频转换器格式工厂(格式工厂怎么转换mp4)

各位老铁们好,相信很多人对视频转换器格式工厂都不是特别的了解,因此呢,今天就来为大家分享下关于视频转换器格式工厂以及格式工厂怎么转换mp4的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录格式工厂怎么转换mp4万能

2024年7月10日 13:15

连锁收银系统(有哪些比较好的美业连锁收银系统求推荐)

连锁收银系统(有哪些比较好的美业连锁收银系统求推荐)

本文目录有哪些比较好的美业连锁收银系统求推荐餐饮收银系统前十排名连锁超市收银系统软件哪个好有哪些比较好的美业连锁收银系统求推荐有哪些比较好的美业连锁收银系统?目前市场上的美容院收银管理软件很多,许多人就在想什么样美容院收银软件比较好用了?那

2024年5月16日 11:07

创意二维码生成器在线制作(二维码生成器怎么制作)

创意二维码生成器在线制作(二维码生成器怎么制作)

本篇文章给大家谈谈创意二维码生成器在线制作,以及二维码生成器怎么制作对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录二维码生成器怎么制作如何

2024年6月19日 03:59

猫咪软件app下载(猫咪检测仪APP适用于苹果什么系统)

猫咪软件app下载(猫咪检测仪APP适用于苹果什么系统)

本文目录猫咪检测仪APP适用于苹果什么系统在通知栏是黑色小猫咪是什么APP宠物猫什么app软件上最便宜糖猫软件在苹果上找不到脸猫软件换脸的app宠物app软件哪个好用猫咪检测仪APP适用于苹果什么系统题主是否想询问“猫咪鉴定器APP适用于苹

2024年1月11日 06:20

office2007兼容包(office2007的兼容包下到哪了)

office2007兼容包(office2007的兼容包下到哪了)

本文目录office2007的兼容包下到哪了office2007兼容包怎么用 office2007兼容包怎么安装如何安装office2007兼容包office2007文件格式兼容包的安装使用方法office2007兼容包的作用 是什么关于O

2024年3月28日 16:01

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1730
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1155
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1152
标签列表

热门搜索