关于hibernate锁,缓存

来源:互联网 发布:白酒网络推广方案 编辑:程序博客网 时间:2024/04/29 04:16

hibernate锁

在hibernate并发中起作用

hibernate分为乐观锁与悲观锁

悲观锁在一个人修改数据的时候不允许别人对此数据进行修改,直到此数据修改完成

乐观锁允许,有很好的并发效果,在允许时候进行标记。

<version name="varsion" column="version" type=""></varsion>

也可用<timestamp>

也可以在class下配置optimisitic-lock


  •  
    <?xml version="1.0"?> 
  •  <!DOCTYPE hibernate-mapping PUBLIC   
  •      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  •      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  •  <hibernate-mapping package="org.apple.hibernate" optimisitic-lock="all"> 
  •      <class name="" table=""> 
  •          <id name="id"> 
  •              <generator class="native"/> 
  •          </id> 
  •         <property name="s"/> 
  •         <property name="t"/> 
  •     </class> 
  • </hibernate-mapping> 

    关于缓存

    get,load

    get是先到session中查找,然后去二级缓存中找,最后去数据库找。

    load是先到session找,然后创建代理,所以一般运用load实现延时加载。

    总结:get没有找到返回null,load的话一定认为数据库中有记录,如果没有记录的话就会抛出异常org.hibernate.ObjectNotFoundException

    二级缓存

    一般使用二级缓存是ehcache

    在配置xx.hbm.xml文件时候再class下加<cache usage="read-write"/>(读写) 或者<cache usage="read-only"/>(只读)

    在hibernate.cfg.xml中添加如下配置:     
      property name="hibernate.cache.use_second_level_cache">true</property> 

    <!-- 设置缓存提供者 --> 

    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 

    编写ehcache.xml 配置文件
     <ehcache>
     <!--  maxElementsInMemory="10000" 缓存中最大允许创建的对象数 -->
     <!-- eternal="false" 缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期 -->
     <!-- timeToIdleSeconds="120" 缓存数据钝化时间(设置对象在它过期之前的空闲时间) -->             
     <!--  timeToLiveSeconds="120" 缓存数据的生存时间(设置对象在它过期之前的生存时间) -->
     <!--  overflowToDisk="true" 内存不足时,是否启用磁盘缓存 -->
         <diskStore path="c:\\ehcache\"/>      
         <defaultCache      
      maxElementsInMemory="10000"      
      eternal="false"      
      timeToIdleSeconds="120"      
      timeToLiveSeconds="120"      
      overflowToDisk="true"         
      />      
     </ehcache>

    使用查询方法
      /****
       * 根据hql查询List
       */
      public List findCacheListByHql(final String hql) {
       // TODO Auto-generated method stub
       return this.getHibernateTemplate().executeFind(new HibernateCallback(){    
        public Object doInHibernate(Session session)
          throws HibernateException, SQLException {
         // TODO Auto-generated method stub
         Query queryObject = session.createQuery(hql);
         //设置是否启用缓存
         queryObject.setCacheable(true);
         if(getHibernateTemplate().getQueryCacheRegion() != null){
          queryObject.setCacheRegion(getHibernateTemplate().getQueryCacheRegion());
         }
         return queryObject.list();
        }
       });
      }

    缓存仅仅对hql查询生效,如果使用sql更新数据库,缓存不会被修改,只有使用hql操作数据库才能同步修改缓存数据!











  • 0 0