Hibernate中的Session缓存问题

1.  Session  缓存:

1   .    Session  接口的实现中包括一系列的  Java  集合  ,  这些  Java  集合构成了  Session  缓存  .
          用于存放  Session  关联的对象  Session  关联对象的方式有非常多种。

        
          比如: session.get  ( Class  ,  OID  )   session.update ()   session.save  ()    ... )。
          仅仅要  Session  实例没有结束生命周期  ,  且没有清理缓存。则存放在它缓存中的对象也不会结束生命周期。

        Session  缓存可降低 Hibernate  应用程序訪问数据库的频率

2   .  操作  Session  缓存的方法(了解一下吧)。


     .  若调用  session.get  ()  从数据库中载入一个对象。则该对象会被纳入到  Session  缓存中。

        News news  =  ( News  )  session.get  ( News.class  ,  1 );

     // 会向数据库发送  SQL    ?  不会发送  SQL  语句  ,  而是从  Session  缓存获取对象的引用(快照)
        News news2  =  ( News  )  session.get  ( News.class  ,  1 );

     . Session    clear ()  方法能够清空  Session  的缓存

    News news  =  ( News )  session.get ( News.class ,  1 );

     // 清理    session  缓存
        session.clear  ();
        
     // 会向数据库发送  SQL    ?    !  由于  Session  缓存被清空了  !
        News news2  =  ( News  )  session.get  ( News.class  ,  1 );

. Session   flush()  方法:
    清理缓存  -  强制使数据库记录和  Session  缓存中对象状态保持一致,可能会发送  SQL  语句
   (若数据库记录和  Session  中对象状态不一致。则发送  SQL 。否则不发送  SQL

    I.  默认情况下,提交事务时,会先清理缓存。然后再提交事务

    II.  若主键生成方式使用的是数据库底层的自增长方式。会在运行  Session    save ()  方法时,就清理缓存,运行  INSERT  语句。 而不是等到提交事务时。  Hibernate  要求和  Session  关联的对象必须有和数据表记录相应的  OID ,这就意味着运行  save ()  方法后。 必须有  OID  ,而底层自增长的方式生成主键,必须先运行  INSERT  才干获取主键值

     // 若使用  MySQL  底层自增的方式生成主键,  save ()  方法即会引起发送  INSERT  语句
        session.save  ( news  );
        System.out.println  ( news.getId  ());

    III.  使用  HQL Hibernate Query Language  )查询记录时,不经过  Session  缓存!直接查询数据库,且要求查询的结果是最新的。
     所以,在进行  HQL  查询之前须要先清理缓存
    session.save ( news );

     // 会导致清理缓存
    News news2  =  ( News )  session.createQuery  ( "FROM News n WHERE n.id = ?"  )
                                           . setInteger  ( 0  ,  news.getId  ()). uniqueResult  ();

    IV. commit ()  flush()  方法的差别:
          flush  运行一系列  sql  语句,但不提交事务;
        commit  方法先调用 flush ()  方法,然后提交事务  .  意味着提交事务对数据库的操作永久保存下来。

. refresh  () 方法:
    强制使  Session  缓存中的对象的状态和数据库记录保持一致。

所以会强制发送一条

  SELECT  语句。
     注意,由于  MySQL  的默认的隔离级别为  READ REPTABLE  。所以须要设置事务的隔离级别才干看到实验的效果

     < ! --  设置  Hibernate  的事务的隔离级别 ,  设置为读已提交  -->
     <property name ="connection.isolation" >2 </property >




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值