Hibernate缓存策略之二级缓存
一级缓存,即session级缓存,是最最重要的,因为它不能够被取消,现在看看二级缓存.
Hibernate二级缓存不是由本身维护的,它是由第三发缓存框架来提供的。看一下如何使用二级缓存:
1、首先要打开二级缓存 <!-- 配置打开二级缓存 --> <property name="hibernate.cache.use_second_level_cache">true</property> 2、指定缓存提供商。即有谁来提供缓存的功能 <!-- 指定二级缓存的具体实现! --> <property name="hibernate.cache.provider_class"> org.hibernate.cache.HashtableCacheProvider</property> 3、配置哪些实体类使用哪种缓存策略(只读策略、读写策略等等) //前两步是hibernate配置文件中配置的,而这一步配置可在某个实体映射文件中进行配置。如下: <class name="cn.lf.hibernate3.Person" table="t_person"> <cache usage="read-only"/> <id name="id"> <generator class="native"/> </id> //也可以在hibernate配置文件中进行配置,这样的话就不用在映射文件中去修改了,直接改配置文件即可,如下: <class-cache class="" usage="read-only"/> //usage:read-write
测试代码如下:
Session session = HibernateUtil.openSession(); try{ session.beginTransaction(); //将发出SQL查询语句查询实体对象的数据 Person p = (Person)session.load(Person.class, 1); System.out.println(p.getName()); //实体对象已经被缓存,所以下列操作不再发出SQL语句 Person p2 = (Person)session.load(Person.class, 1); System.out.println(p2.getName()); session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().rollback(); }finally{ //session关闭之后,当前session对象中的一级缓存已经被清空 session.close(); } Session session2 = HibernateUtil.openSession(); try{ session2.beginTransaction(); //由于启用了二级缓存,所以实体对象已经被缓存,所以下列操作不再发出SQL语句 Person p = (Person)session2.load(Person.class, 1); System.out.println(p.getName()); //不再发出SQL语句! Person p2 = (Person)session2.load(Person.class, 1); System.out.println(p2.getName()); session2.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session2.getTransaction().rollback(); }finally{ session2.close(); }
下面来研究下二级缓存的管理:
Session session = HibernateUtil.openSession(); try{ session.beginTransaction(); //将发出SQL查询语句查询实体对象的数据 Person p = (Person)session.load(Person.class, 1); System.out.println(p.getName()); //实体对象已经被缓存,所以下列操作不再发出SQL语句 Person p2 = (Person)session.load(Person.class, 1); System.out.println(p2.getName()); session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().rollback(); }finally{ //session关闭之后,当前session对象中的一级缓存已经被清空 session.close(); } Session session2 = HibernateUtil.openSession(); try{ session2.beginTransaction(); session.getSessionFactory().getCache().evictEntityRegion(ContactPerson.class); //由于清空了二级缓存,所以再次发出SQL语句 Person p = (Person)session2.load(Person.class, 1); System.out.println(p.getName()); //不再发出SQL语句! Person p2 = (Person)session2.load(Person.class, 1); System.out.println(p2.getName()); session2.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session2.getTransaction().rollback(); }finally{ session2.close(); }
如果定义二级缓存为只读缓存那么是不允许修改的。
了解下缓存模式,即如何跟二级缓存进行交互:CacheMode
相关推荐
微微撒 2020-04-18
gwn00 2020-01-14
无情的你无情的雨 2020-07-18
dongxurr 2020-07-26
jimgreatly 2020-06-03
cnflat0 2020-04-25
技术驱动人生 2020-04-08
Justagreenonion 2020-03-27
zhiyuan0 2020-02-24
云之飞踢 2020-01-28
明月清风精进不止 2020-01-07
Justagreenonion 2020-01-05
manbucy 2014-05-20
javamagicsun 2019-12-17
栖梧桐 2019-12-13
javamagicsun 2019-12-04
GechangLiu 2016-11-23
flydoging 2019-11-05
Ashes 2019-11-05