posts - 66,  comments - 11,  trackbacks - 0
  基于Java的缓存实现,最简单的方式莫过于对集合类数据类型进行封装。Hibernate提供了基于Hashtable的缓存实现机制,不过,由于其性能和功能上的局限,仅供开发调试中使用。同时,Hibernate还提供了面向第三方缓存实现的接口,如:
HashTable--------------------------------net.sf.hibernate.cache.HashtableCacheProvider
1、JSC
2、EHCache->默认的二级Cache实现。--------net.sf.encache.hibernate.Provider
3、OSCache-------------------------------net.sf.hibernate.cache.OSCacheProvider
4、JBoss Cache->分布式缓存---------------net.sf.hibernate.cache.TreeCacheProvider
5、SwarmCache----------------------------net.sf.hibernate.cache.SwarmCacheProvider
相对于JSC而言,EHCache更加稳定,并具备更好的混存调度性能,其缺陷是目前还无法做到分布式缓存。
首先设置hibernate.cfg.xml然后设置ehcache.xml最后设置缓存策略。

  缓存同步策略决定了数据对象在缓存中的存取规则。为了使得缓存调度遵循正确的应用级事物隔离机制,我们必须为每个实体类指定相应的缓存同步策略。Hibernate提供4种内置的缓存同步策略:
1、read-only:只读。对于不会发生改变的数据,可使用只读型缓存。
2、nonstrict-read-write:如果程序对并发访问下的数据同步要求不是非常严格,且数据更新操作频率较低,可以采用本选项。
3、read-write:严格可读写缓存。
4、transactional:事务型缓存,必须运行在JTA事物环境中。

  JDBC事物由Connection管理,也就是说,事务管理实际上是在JDBC Connection中实现。事务周期限于Connection的生命周期之类。同样,对于基于JDBC Transaction的Hibernate事务管理机制而言,事物管理在Session所以托的JDBCConnection中实现,事务周期限于Session的生命周期。
  JTA事物管理则由JTA容器实现,JTA容器对当前加入事物的众多Connection进行调度,实现其事务性要求。JTA的事物周期可横跨多个JDBC Connectin生命周期。同样对于基于JTA事务的Hibernate而言,JTA事物横跨多个Session.

  Hibernate支持2种锁机制:即通常所说的悲观锁和乐观锁。
  悲观锁的实现,往往依靠数据库提供的锁机制。典型的悲观锁调用:
  select * from account where name=="Erica" for update
package com.hibernate.higherApplication;

import java.util.List;

import junit.framework.TestCase;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
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.Expression;

public class LockOperator extends TestCase {
    
private Session session = null;
    
/**
     * 初始化资源
     
*/
    
protected void setUp() throws Exception {
        
try {
            
//加载类路径下的hibernate.cfg.xml文件
            Configuration config = new Configuration().configure();
            
//创建sessionFactory对象
            SessionFactory sessionFactory = config.buildSessionFactory();
            
//创建session
            session = sessionFactory.openSession();
        } 
catch (HibernateException e) {
            e.printStackTrace();
        }        
    }
    
/**
     * 悲观锁
     * Hibernate的加锁模式有:
     * 1、LockMode.NONE:无锁机制
     * 2、LockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取
     * 3、LockMode.READ:Hibernate在读取记录的时候会自动获取
     * 上述3种锁机制为了保证update过程中对象不会被外界修改,在目标对象上加锁,与数据库无关
     * 4、LockMode.UPGRADE:利用数据库的for update子句加锁
     * 5、LockMode.UPGRADE_NOWAIT:oracle的特定实现
     * 注意:只有在查询开始之前设定加锁,才会真正通过数据库的锁机制进行加锁处理。
     
*/
    
public void addPessimismLock(){
        String hqlStr 
= "from TUser as user where user.name='Erica'";
        Query query 
= session.createQuery(hqlStr);
        query.setLockMode(
"user",LockMode.UPGRADE);//多所有返回的user对象加锁
        List userList = query.list();//执行查询
    }
    
/**
     * 乐观锁
     * 数据版本:即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个version字段来实现。
     * 读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1.此时,将提交数据的版本数据与数据库对应记录的当前版本信息
     * 进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
     * 
     * Hibernate在其数据访问引擎中内置了乐观锁实现。如果不考虑外部系统对数据库的更新操作,利用Hibernate提供的透明化乐观锁
     * 实现,将大大提升我们的生产力。见配置文件T_USER.hbm.xml
     * 乐观锁机制避免了长事务中的数据加锁开销,大大提升了大并发量下的系统整体性能表象。
     *
     
*/
    
public void addOptimismLock(){
        Criteria criteria 
= session.createCriteria(TUser.class);
        criteria.add(Expression.eq(
"name","Erica"));
        
        List userList 
= criteria.list();
        TUser user 
= (TUser)userList.get(0);
        
        Transaction tx 
= session.beginTransaction();
        user.setVersion(
1);
        tx.commit();
    }
    
/**
     * 关闭资源
     
*/
    
protected void tearDown() throws Exception {
        
try{
            session.close();
        }
catch(HibernateException e){
            e.printStackTrace();
        }
    }
    
}

<?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>
    
<!-- 
        none:无乐观锁
        version:通过版本机制实现乐观锁
        dirty:通过检查发生变动过的属性实现乐观锁
        all通过检查所有属性实现乐观锁
     
-->
    
<class
        
name="org.hibernate.sample.TUSER"
        table
="t_user"
        dynamic-update
="true"
        dynamic-insert
="true"
        optimistic-lock
="version"
        lazy
="true"
        
>
        
<id
        
name="id"
        column
="id"
        type
="java.lang.Integer"
        
>
            
<generator class="native">
            
</generator>
        
</id>
        
<version name="version" column="version" type="java.lang.Integer">
        
</version>
        
<set name="addresses"
             table
="t_address"
             lazy
="true"
             inverse
="false"
             cascade
="all"
        
>
            
<key
                
column="user_id"
            
>
            
</key>
            
<one-to-many class=""/>
        
</set>
    
</class>
</hibernate-mapping>


posted on 2010-01-02 15:25 王永庆 阅读(548) 评论(0)  编辑  收藏 所属分类: HIBERNATE

只有注册用户登录后才能发表评论。


网站导航:
 
<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(1)

随笔分类

随笔档案

关注blogs

搜索

  •  

最新评论

阅读排行榜

评论排行榜