Hibernate一级缓存和二级缓存深度比较
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Hibernate一级缓存和二级缓存深度比较,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4053字,纯文字阅读大概需要6分钟。
内容图文
1.什么是缓存
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。
Hibernate的一级缓存是内置的,不能被卸载。
Hibernate的二级缓存是SessionFactory的缓存,可分为内置缓存和外置缓存,内置缓存是Hibernate 自带的, 不可卸载. 通常在 Hibernate 的初始化阶段, Hibernate 会把映射元数据和预定义的 SQL 语句放到 SessionFactory 的缓存中, 映射元数据是映射文件中数据的复制, 而预定义 SQL 语句是 Hibernate 根据映射元数据推倒出来的. 该内置缓存是只读的。外置缓存是一个可配置的缓存插件,默认情况下 SessionFactory 不会启动二级缓存,需要用户自己导入第三方插件,在hibernate.cfg.xml文件中通过配置开启二级缓存。外置缓存中的数据是数据库数据的复制, 外置缓存的物理介质可以是内存或硬盘。
2.Hibernate缓存配置
Hibernate的一级缓存和二级内置缓存是自带的,不可卸载,也无需配置。
下面我们主要介绍二级外置缓存插件的配置,下面是几种常用的缓存插件:
- EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
- OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
- SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
- JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。
- memcached:可作为群集范围内的缓存,支持事务型并发访问策略,不支持region
- redis:
- gemfire:
- hazelcast:集群下,可支持读写
hazelcast 配置参考:https://github.com/hazelcast/hazelcast-code-samples/tree/master/hazelcast-integration/hibernate-2ndlevel-cache
redis:配置参考https://github.com/debop/hibernate-redis
EhCache:
sessionFactory配置注入:
< prop key ="hibernate.cache.use_query_cache" >true</prop><prop key="hibernate.cache.use_second_level_cache">true</prop><prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
*.hbm.xml 配置修改(注意:ehcache不支持transactional,其他三种可以支持。)
< class name ="com.hoo.hibernate.entity.User" table ="USER" lazy ="false" > < cache usage ="transactional|read-write|nonstrict-read-write|read-only" />
hibernateTemplate注入修改
< bean id ="hibernateTemplate" class ="org.springframework.orm.hibernate3.HibernateTemplate" > < property name ="sessionFactory" > < ref bean ="sessionFactory" /> </ property > < property name ="cacheQueries" > < value >true</value></property></bean>
Session直接调用,修改
Session s = HibernateSessionFactory.getSession(); Criteria c = s.createCriteria(User.class); c.setCacheable(true);//这句必须要有 System.out.println("第一次读取"); List<User> users = c.list(); System.out.println(users.size()); HibernateSessionFactory.closeSession(); s = HibernateSessionFactory.getSession(); c = s.createCriteria(User.class); c.setCacheable(true);//这句必须要有 System.out.println("第二次读取"); users = c.list(); System.out.println(users.size()); HibernateSessionFactory.closeSession();
ehcache.xml配置
< cache name ="com.hoo.hibernate.entity.User" maxElementsInMemory ="10000" eternal ="false" timeToIdleSeconds ="300" timeToLiveSeconds ="600" overflowToDisk ="true" /> <!-- hbm文件查找cache方法名的策略:如果不指定hbm文件中的region="ehcache.xml中的name的属性值",则使用name名为com.hoo.hibernate.entity.User的cache,如果不存在与类名匹配的cache名称,则用 defaultCache。 如果User包含set集合,则需要另行指定其cache 例如User包含citySet集合,则需要 添加如下配置到ehcache.xml中 --> < cache name ="com.hoo.hibernate.entity.citySet" maxElementsInMemory ="10000" eternal ="false" timeToIdleSeconds ="300" timeToLiveSeconds ="600" overflowToDisk ="true" /> < cache name ="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory ="5000" eternal ="true" overflowToDisk ="true" /> < cache name ="org.hibernate.cache.StandardQueryCache" maxElementsInMemory ="10000" eternal ="false" timeToLiveSeconds ="120" overflowToDisk ="true" />
调试时候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操作过程,主要用于调试过程,实际应用发布时候,请注释掉,以免影响性能。
3.一级缓存与二级缓存的区别
存放数据的形式;前者是相互关联的持久化对象,后者是对象的散装数据
缓存的范围;前者是事务范围,每个事务都拥有单独的第一级缓存,后者是进程范围或者群集范围,缓 存被同一个进程或者群集范围内的所有事务共享
并发访问策略;前者不会出现并发问题,无须提供并发访问策略,后者必须提供适当的并发访问策略, 来保证特定的事务隔离级别
数据过期策略;前者没有数据过期策略,后者有,如缓存对象的数目,对象处于缓存中的最长时间,以 及对象处于缓存中的最长空闲时间
物理介质;前者是内存,后者是内存和硬盘
缓存的软件实现;前者仅仅因为Hibernate的Session的实现中包含了缓存的实现,后者 由第三方提供了 缓存的适配器(CacheProvider)用于把特定的缓存插件集成到
启用缓存的方式;前者通过Session接口执行操作就会启用缓存,后者需要用户在单个类或者单个集合的 粒度上配置第二级缓存。
管理缓存的方式;前者可以通过检索策略和检索方式来限制加载对象的数目,后者管理缓存主要有 两个方面:A:选择需要使用第二级缓存的持久化类,设置合适的并发访问策略;B:选择缓存适配器,设置合适的数据过期策略;
原文:http://www.cnblogs.com/zhulongchao/p/4725720.html
内容总结
以上是互联网集市为您收集整理的Hibernate一级缓存和二级缓存深度比较全部内容,希望文章能够帮你解决Hibernate一级缓存和二级缓存深度比较所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。