hibernate学习心得(二)

五、二级缓存

之前提到过,hibernate的缓存机制比较厉害,现在就介绍一下二级缓存。
1、适用场合:数据不能频繁更新,且数据能公开,私密性不是很强的场合
2、hibernate本身并没有提供二级缓存的解决方案
3、二级缓存的实现是依赖于第三方供应商完成的
ehcache
oscache
jbosscache
swamchache
4、二级缓存的操作
1、二级缓存存在sessionFactory中
2、生命周期:与sessionFactory保持一致
3、使用二级缓存的步骤
1、在hibernate.cfg.xml中添加如下内容进行配置

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

其中第一个property是告诉框架我们要使用二级缓存,而第二个property则是指定我们要使用的二级缓存的提供商
2、让某一个对象进入到二级缓存中
* 在配置文件hibernate.cfg.xml中如下配置:

     <class-cache usage="read-only" class="cn.itcast.hiberate.sh.domain.Classes"/>
             *  在映射文件*.hbm.xml中如下配置
         <cache usage="read-only"/>
         3、使用方法
              session.get()/session.load()

六、如何提高hibernate的性能

提高hibernate性能的方法有如下几种:懒加载、抓取策略、缓存策略和HQL语句,在这里只介绍懒加载和抓取策略。
(1)懒加载
懒加载也被称作延迟加载,在业务中,也许我们不需要查询出某些信息,若太早查询出来,则会大量占用内存,使得系统性能下降,这时候可以延迟这部分内容的加载时间。懒加载主要有针对持久化类的懒加载和针对集合的懒加载。针对持久化类时,区别在于一行代码,若我们从数据库中查询一个对象的时候使用这样的语句:session.get(×××.class,1);则不会懒加载,执行到这行代码的时候就会发出SQL语句,当使用session.load(×××.class,1);时则使用懒加载,执行这行代码的时候并不发出SQL语句,只有程序员查询这个对象的具体属性的时候才发出(注:只限一般属性,标示符属性不在此列);针对集合的时候,比如如下的班级类的配置信息:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.itcast.hiberate.sh.domain.Classes">
        <id name="cid" length="5" type="java.lang.Long">
            <generator class="increment"></generator>
        </id>
        <property name="cname" length="20" type="java.lang.String"></property>

        <property name="description" length="100" type="java.lang.String"></property>

        <set name="students" cascade="save-update" inverse="true" lazy="false" fetch="join">

            <key>
                <column name="cid"></column>
            </key>
            <one-to-many class="cn.itcast.hiberate.sh.domain.Student"/>
        </set>
    </class>
</hibernate-mapping>

我们可以看到,在班级的配置信息里有一对<set></set>的标签,保存了学生类型,后面有一个“lazy”的属性,若配置为“false”则不开启懒加载,反之,配置为“true”则开启懒加载,当查询班级信息的时候并不查询学生信息,只有当遍历学生集合的时候才发出SQL语句查询学生信息。
(2)抓取策略
抓取策略研究的主要是set集合如何提取数据,还是用班级表来举例子,在Classes.hbm.xml文件中配置“fetch”属性:

    <set fetch="join/select/subselect">

“fetch”属性有三个取值,分别是:join、select、subselect,区别如下:
join 左外连接
如果把需求分析翻译sql语句,存在子查询,这个时候用该策略不起作用
select 默认
先查询一的一端,再查询多的一端
subselect 子查询
如果需要分析翻译成sql语句存在子查询,这个时候用该策略效率最高

暂时就总结到这里吧,也许不是很准确,但用得多了,理解一定会加深的。

你可能感兴趣的:(Hibernate,缓存,缓存机制)