hibernate-7-缓存的初步了解

来源:互联网 发布:code.org 是什么软件 编辑:程序博客网 时间:2024/06/08 07:39
package com.test;import java.util.List;import org.hibernate.Criteria;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.criterion.Restrictions;import org.hibernate.criterion.SimpleExpression;import org.junit.Test;import com.entity.Person;import com.util.GetHibernateSessionFactory;/** * 二级缓存 * 创建人:曹雪坤 * 时间:2016年12月24日-下午3:43:52  * @version 1.0.0 * */public class Test5 {/** * 二级缓存和一级缓存一样都是通过id来加载和缓存数据 * 一级缓存是事务级别缓存,二级缓存是进程级别缓存,可插拔,有SessionFactory负责管理 * 当查找某个对象时,先查找一级缓存,如果没有在找二级缓存,还没有,直接查数据库 *  * SessionFactory缓存分为“内置缓存”和“外置缓存” * 内置缓存:hibernate自带,不可卸载 * 外置缓存(二级缓存):可配置的缓存插件,SessionFatory不会启用这个缓存插件,外置缓存的物理介质可以是内存或硬盘 *  * 二级缓存分为: * Class Cache Region(类级别缓存):主要存储实体对象 * Collection Cache Region(集合级别的缓存):存储集合数据 * Query Cache Region(查询缓存):常用的查询语句的结果集 * Update Timestamps(更新时间戳缓存):不知道 *  * 常用的二级缓存有: * EHCache,OpenSymphony OSCache,SwarmCache,JbossCache *  * 多个事务二级缓存并发访问相同的数据时,也需要事务的隔离 * 只读型(Read-Only)含义不是很明白 * 读写型(Read-write)  含义不是很明白 * 非严格读写(Nonstrict-read-write)  含义不是很明白 * 事务型(Transactional) 含义不是很明白 *  * 下面的案例为EHCache * 下面的代码开启了两个session。 * 取到p1时session中没有查询数据库,打印一条sql语句,将取到的对象存入一级缓存,并且存入二级缓存,但二级缓存存放的数据是散装数据, * 他们会重新new一个对象 ,所以此时二级缓存中的对象和一级缓存中的对象属性各方面都相同,但是对象索引地址却不相同,所以p1==p3为false * 得到p2时session中有数据,并且没有关闭,直接获取,因为p1,p2都是从一级缓存中取得,所以p1==p2为true * session关闭,session中的数据清空 * 取得p3因为session已经关闭,创建了session1,但可以从二级缓存中取得,所以没有打印sql语句,取得后二级缓存和一级缓存做一个同步,Person的id为1的 * 实例有存在一级缓存(session1)中了。p3==p4为true *  * hibernate中的配置 * <!-- 开启二级缓存 --><property name="hibernate.cache.use_second_level_cache">true</property><!-- 指定二级缓存供应商 --><!--这是hibernate3的配置 <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> --><!-- 这是hibernate4的 指定二级缓存供应商--><property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property><!-- 开启查询缓存 -->  <property name="hibernate.cache.use_query_cache">true</property> <mapping resource="Person.hbm.xml"/><!-- 指定哪些数据存储到二级缓存中   这个必须放在mapping的后面,否则报错--><class-cache usage="read-only" class="com.entity.Person"/>usage="read-only":事务的隔离级别. *  */public static void main(String[] args) {Session session = GetHibernateSessionFactory.sessionFactory.openSession();Transaction t = session.beginTransaction();Transaction tx = session.beginTransaction();Person p1 = (Person) session.get(Person.class, 1);Person p2 = (Person) session.get(Person.class, 1);System.out.println((p1==p2)+"====================");tx.commit();session.close();Session session1 = GetHibernateSessionFactory.sessionFactory.openSession();Transaction tx1 = session1.beginTransaction();Person p3 = (Person) session1.get(Person.class, 1);System.out.println((p1==p3)+"====================");Person p4 = (Person) session1.get(Person.class, 1);System.out.println((p3==p4)+"====================");tx1.commit();session1.close();}}

原创粉丝点击