本篇文章为大家展示了hibernate在java中使用如何实现二级缓存,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
hibernate的二级缓存
<强>一、缓存概述强>
缓存(缓存):计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存
<强> hibernate中提供了两个级别的缓存强>
第一级别的缓存是会话级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预
第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围的缓存
<强> hibernate的缓存可以分为两类:强>
内置缓存:hibernate自带的,不可卸载。通常在Hibernate的初始化阶段,Hibernate会把映射元数据和预定义的SQL语句放到SessionFactory的缓存中,映射元数据是映射文件中数据的复制,而预定义SQL语句时Hibernate根据映射元数据推到出来的。该内置缓存是只读的。
外置缓存(二级缓存):一个可配置的缓存插件。在默认情况下,SessionFactory不会启用这个缓存插件。外置缓存中的数据是数据库数据的复制,外置缓存的物理介质可以是内存或硬盘
<强>二、理解二级缓存的并发访问策略强>
<强>三,配置进程范围内的二级缓存(配置ehcache缓存)强>
1拷贝ehcache-1.5.0。jar到当前工程的自由目录下
依赖backport-util-concurrent和通用日志
2开启二级缓存
& lt;属性名=癶ibernate.cache.use_second_level_cache"祝辞true
3要指定缓存的供应商
& lt;属性名=癶ibernate.cache.provider_class"比; org.hibernate.cache.EhCacheProvider
4指定使用二级缓存的类
方法一在使用类的* pojo所用的. hbm。xml配置
选择需要使用二级缓存的持久化类,设置它的二级缓存的并发访问策略,& lt; class>元素的缓存子元素表明Hibernate会缓存对象的简单属性,但不会缓存集合属性,若希望缓存集合属性中的元素,必须在& lt; set>元素中加入& lt; cache>子元素
方法二,在hibernate.cfg.xml文件中配置(建议)
5,配置ehcache默认的配置文件ehcache.xml(名字固定)(放在类路径下)
& lt; ehcache xmlns: xsi=癶ttp://www.w3.org/2001/XMLSchema-instance"xsi: noNamespaceSchemaLocation=? ./config/ehcache.xsd"比; & lt; diskStore路径=癱:/ehcache"/比; & lt; defaultCache maxElementsInMemory=?”; 永恒的=癴alse" timeToIdleSeconds=?20”; timeToLiveSeconds=?20”; overflowToDisk=皌rue" maxElementsOnDisk=?0000000”; diskPersistent=癴alse" diskExpiryThreadIntervalSeconds=?20”; memoryStoreEvictionPolicy=癓RU"/比; & lt;/ehcache><强>四、测试强>
包com.sihai.hibernate3.test; 进口java.util.Iterator; 进口并不知道; 进口org.hibernate.Query; 进口org.hibernate.Session; 进口org.hibernate.Transaction; 进口org.junit.Test; 进口com.sihai.hibernate3.demo1.Customer; 进口com.sihai.hibernate3.demo1.Order; 进口com.sihai.utils.HibernateUtils; 公开课HibernateTest6 { @Test//查询缓存的测试 公共空间demo9 () { 会议会话=HibernateUtils.getCurrentSession (); 事务tx=session.beginTransaction (); 查询查询=session.createQuery(“从客户选择c.cname c");//使用查询缓存: query.setCacheable(真正的); query.list (); tx.commit (); 会话=HibernateUtils.getCurrentSession (); tx=session.beginTransaction (); 查询=session.createQuery(“从客户选择c.cname c"); query.setCacheable(真正的); query.list (); tx.commit (); } @SuppressWarnings (“unused") @Test//更新时间戳 公共空间demo8 () { 会议会话=HibernateUtils.getCurrentSession (); 事务tx=session.beginTransaction (); 客户客户=(客户)session.get(客户。类,2); session.createQuery(“更新客户设置cname=& # 39;奶茶& # 39;cid=2“) .executeUpdate (); tx.commit (); 会话=HibernateUtils.getCurrentSession (); tx=session.beginTransaction (); 客户customer2=(客户)session.get(客户。类,2); tx.commit (); } @SuppressWarnings (“all") @Test//将内存中的数据写到硬盘 公共空间demo7 () { 会议会话=HibernateUtils.getCurrentSession (); 事务tx=session.beginTransaction (); Listhibernate在java中使用如何实现二级缓存