Hibernate查询

 

 

      Hibernate的缓存一般分为3类:

            1).一级缓存.Session缓存称为一级缓存,由于Session对象的得生命周期通常对应一个数据库事务,因此它的缓存是事务范围的缓存,.注意:  一级缓存是必需的.在一级缓存中,持久化类的每个实例都具有唯一性的OID.

     

            2).二级缓存.SessionFactory缓存分为内置缓存和外置缓存.内置缓存是Hibernate自带的,不可拆卸,是只读缓存,用来存放映射元数据和预定义SQL语句.外置缓存是一个可配置的缓存插件,默认SessionFactory不会启用这个缓存插件.外置缓存中的数据库数据的复制.  SessionFactory对象的生命周期和应用程序的整个进程对应.二级缓存是可选的,可以在每个类型或每个集合的粒度上配置二级缓存.

 

           3).  查询缓存,它是Hibernate为查询结果提供的,依赖二级缓存.

 

(1)  事务范围.每个事务都有自己的缓存,缓存内数据不会被多个事务并发访问.例如,Hibernate的以及缓存,事务是不能跨多个Session的,Session内数据只能被当前事务访问,因此它属于事务范围的缓存.

(2)  进程范围.进程内的所有事务共享缓存,进程结束,缓存结束生命周期,例如,Hibernate的二级缓存,SessionFactory对象的生命周期对应应用程序的整个进程,因此它属于进程范围的缓存.

(3)  集群缓存范围.缓存被一个或多个机器上的多个进程共享.Hibernate的二级缓存也可以作为集群范围的缓存.

 

Hibernate  一级缓存:

     刚才说了,Session内的缓存就是一级缓存,位于缓存中的对象成为持久化对象,它和数据库中的相关记录对应.Session能够在某些时间点,按照缓存中对象的变化执行相关SQL语句,从而同步更新数据库,这一过程称为刷新缓存.

    当应用程序调用Session的save() ,  update() ,  saveOrUpdate()  ,  load()  或get()  方法,以及调用Query查询接口的list()  iterate方法时 ,如果在Session的缓存中还不存在相应的对象,Hibernate就会把该对象加入到一级缓存中.在刷新缓存时Hibernate会根据缓存中对象的状态变化来同步更新数据库.由此可见,Session缓存有两大作用:

          (1)减少访问数据库中的相关记录与缓存中的相应对象同步.

          (2)保证数据库中的相关记录与缓存中的相应对象同步.

 

举个栗子:

   

 User user1=(User) session.get(User.class, new Byte("1"));

 User user2=(User) session.get(User.class, new Byte("1"));

 System.out.printIn(user1==user2);

 

在控制台可以看到,只输入了一次select语句,user1和user2引用的是同一个对象,第三行输出了  true  !

 

因为第一次user1在数据库中查询了一次,缓存在session中,所以user2查询的是session中的user1的缓存

 

Session为引用程序提供了两个管理缓存的方法:

     (1) evict(Object o)  :从缓存中清除指定的持久化对象.

     (2)clear()  清空缓存中的所有持久化对象.

 

额  还有一个好用的东西:  就是   flush()  方法,flush()  方法用于强制进行从缓存到数据库的同步.

  例如:   

User user=null;

for(int i=0;i<1000;<i++)
{
    user=new User(i,"user"+i);
    session.save(user);
   if(i%30==0)
      {
           session,flush();
           session.clear();
      }
}

tx.commit();

  

 

posted @ 2016-05-13 17:32  咸鱼也疯狂  阅读(321)  评论(0编辑  收藏  举报
Fork me on GitHub