【Hibernate】——缓存

        引言


           hibernate是一个持久化框架爱,经常需要访问数据库。如果我们能够降低应用程序对物理数据库访问的次

数,那会提升应用程序的运行性能。缓存内的书库是物理数据源中的数据的赋值,应用程序运行时先从缓存中读

取数据。

           缓存就是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拷贝,位于数据库和数据库访

问层中间。ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关的数据,如发现所需的数据,

则直接将此数据作为结果加以利用,从而避免了数据库调用性能的开销。而相对内存操作而言,数据库调用是一

个代价高昂的过程。这里就引入了缓存的概念。

           这里主要讲hibernate的缓存,它分为两大类:一级缓存和二级缓存,下边分别讲讲什么是hibernate的一级

缓存和二级缓存。


           Hibernate一级缓存

         

          hibernate的一级缓存,又被称为session级缓存(或事务缓存),生命周期很短,session提交了,缓存就

结束了。session缓存是内置的,不能为卸载,是事务范围的缓存。在一级缓存中,持久化类(Persistent)的每个

实例都具有唯一的OID。

          看一个简单的保存班级学生的例子:

      public static void main(String[] args) {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.getTransaction().begin();
            
            for(int i = 0; i<10; i++){
                Class class1 = new Class();
                class1.setName("班级" + i);
                session.save(class1);
                
                for(int j=0; j<10; j++ ){
                    Student students = new Student();
                    students.setName("班级" + i + "的学生" + i);
                    session.save(students);                    
                }
            }
            
            session.getTransaction().commit();            
        } catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        } finally{
            HibernateUtils.closeSession(session);
        }
    }
          当session.save()时,对象由Transient状态编程Persistent状态;当 session.getTransaction().commit()保存到数

据库;当HibernateUtils.closeSession(session)时,session的声明周期结束,也就是一级缓存结束。

          Hibernate二级缓存


                hibernate二级缓存又被称为SessionFactory级缓存。由于SessionFactory对象的生命周期和应用程序的整个过

程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发

访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,默认下

SessionFactory不会启用这个插件。

        启用二级缓存需要再配置文件hibernate.cfg.xml里配置:

<!-- 配置缓存提供商 -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
		
<!-- 启用二级缓存,这也是它的默认配置 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
          并引入ehcache.xml文件。

       一个简单的例子,看一级缓存与二级缓存如何交互:

       /**
	 * 开启二级缓存
	 *  
	 * 一级缓存和二级缓存的交互 
	 */
	public void testCache4() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//禁止将一级缓存中的数据放到二级缓存中
			session.setCacheMode(CacheMode.IGNORE);
			Student student = (Student)session.load(Student.class, 1);
			System.out.println("student.name=" + student.getName());
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}

		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			Student student = (Student)session.load(Student.class, 1);
			
			//会发出查询语句,因为禁止了一级缓存和二级缓存的交互
			System.out.println("student.name=" + student.getName());
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}
           

           什么样的数据适合放入到缓存中?

         

           1、很少被修改的数据

           2、不是很重要的数据,允许出现偶尔并发的数据

           3、不会被并发访问的数据

           4、常量数据


          什么样的数据不适合放入到缓存中?


          1、经常被修改的数据

          2、绝对不允许出现并发访问的数据,如财务数据。

          3、与其他应用共享的数据


         总结

         

         总的来说,session缓存又三大作用:1、减少访问数据库的频率。应用程序从缓存中读取持久化对象的速度

显然比到数据库中查询数据的速度快多了,因此session的缓存可以提供数据访问的性能。2、当缓存中的持久化对

象之间存在循环关联关系时,session会保证不出现访问对象的死循环,以及由死循环引起的JVM堆栈溢出异常。

3、保证数据库中的相关记录与缓存中的相应对象保持同步。

  



评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值