Hibernate 性能操作

来源:互联网 发布:stc拆分盘源码 编辑:程序博客网 时间:2024/06/05 20:44

一、Hibernate的缓存处理

           1、Hibernate就是对JDBC进行的封装
        2、带来的就是数据访问效率的降低,和性能的下降
        3、对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键

二、什么是缓存
        1、缓存就是数据库数据在内存中的临时容器
        2、位于数据库与数据库访问层中间
        3、ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需的数据,则直接将此数据作为结果加以利用
        4、避免了数据库调用性能的开销.
        5、相对内存操作而言,数据库调用是一个代价高昂的过程.


三、缓存分类

1、一级缓存:即在当前事务范围内的数据缓存
        -Hibernate来讲, (一级缓存)事务级缓存是基于 Session的生命 周期实现的
2、应用级(二级)缓存:即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享.
        -
Hibernate,应用级缓存由SessionFactory实现
        (Ehcached)
3、分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略(OsCache,MEMCACHE)

四、一级缓存
1、Session Level Cache

public class Test {  

      public voidget(){   

            Sessionsession = HibernateSessionFactory.getSession();  

            TUser t =(TUser)session.get("hibernate.TUser", 2);  

           System.out.println(t.getName());  

           session.close();  

            }  

}

SQL语句:

Hibernate: select tuser0_.id as id0_0_, tuser0_.name asname0_0_, tuser0_.sex as sex0_0_ from test.t_user tuser0_ where tuser0_.id=?

说明进行了一次数据库的调用.


代码修改如下:

public class Test {  

      public voidget(){  

            Sessionsession = HibernateSessionFactory.getSession();  

            TUser t =(TUser)session.get("hibernate.TUser", 2);  

           System.out.println(t.getName());  

            TUser tt =(TUser)session.get("hibernate.TUser", 2);  

           System.out.println(tt.getName());  

           session.close();  

      }

控制台仍然只打出一条SQL语句:

Hibernate: select tuser0_.id as id0_0_, tuser0_.name asname0_0_, tuser0_.sex as sex0_0_ from test.t_user tuser0_ wheretuser0_.id=? 

说明还是只进行了一次数据库的调用.


再次修改代码

public class Test {  

      public voidget(){   

            Sessionsession = HibernateSessionFactory.getSession();  

            TUser t =(TUser)session.get("hibernate.TUser", 2);  

           System.out.println(t.getName());  

            session.close();  

            Sessionsession1 = HibernateSessionFactory.getSession();  

            TUser tt =(TUser)session1.get("hibernate.TUser", 2);  

           System.out.println(tt.getName());  

           session1.close();  

      }  

}

控制台打印两条SQL语句:

Hibernate: select tuser0_.id as id0_0_, tuser0_.name asname0_0_, tuser0_.sex as sex0_0_ from test.t_user tuser0_ where tuser0_.id=?

Hibernate: select tuser0_.id as id0_0_, tuser0_.name asname0_0_, tuser0_.sex as sex0_0_ from test.t_user tuser0_ where tuser0_.id=?


 结论:Hibernate进行查询时总是先在缓存中进行查询,如缓存中没有所需数据才进行数据库的查询.Hibernate的内部缓存是基于Session的生命周期的,内部缓存一般由Hibernate自动维护,不需要人为干预,当然我们也可以根据需要进行相应操作:

    Session.evict(Object)(将指定对象从内部缓存清除),

    Session.clear()(清空内部缓存).

    如在两次查询间加入Session.clear()将会清空内部缓存,使得一个Sesion内部的两次相同的查询要对数据库进行两次操作).


五、二级缓存


1、使用第三方缓存组件:EHcache.Hibernate的二级缓存
2、基本信息配置文件

<propertyname="hibernate.cache.EhCacheProvider">true</property>

<property name="cache.provider_class">

  org.hibernate.cache.EhCacheProvider

</property>

<propertyname="hibernate.cache.use_query_cache">true</property>


3、EHcache配置文件

<?xml version="1.0"encoding="UTF-8"?>

<ehcache>

<diskStore path="d:/cache"/>  

<defaultCache 

   maxElementsInMemory="1000"

  eternal="false"

   overflowToDisk="true"

   timeToIdleSeconds="180"

   timeToLiveSeconds=" 300"

  diskPersistent="false" 

  diskExpiryThreadIntervalSeconds= "120"/>

  </ehcache>


4、在hibernate.cfg.xml映射文件中添加缓存同步策略
 
<class-cache usage="read-write" />

六、缓存同步策略

缓存同步策略决定了数据对象在缓存中的存取规则.Hibernate中提供了4种不同的缓存同步策略
            - read-only:只读.对于不会发生改变的数据可使用

         - nonstrict-read-write:如果程序对并发访问下的数据 同步要求不  严格,且数据更新频率较低,采用本缓存 同步策略可获得较  好性能

         - read-write:严格的读写缓存.基于时间戳判定机制,实 现了“read   committed”事务隔离等级.用于对数据同步要求的情况,但 不  支持分布式缓存,实际应用中 使用最多的缓存同步策略.

         - transactional:
事务型缓存,必须运行在JTA事务环境中.此缓存中缓存的相关操作被添加到事务中,如事务失败,则缓冲池的数据 会一同回滚到事务的开始之前的状态.事务型缓存实现了 Repeatable read”事务隔离等级,有效保证了数据的合法性适应于对关键数据的缓存,Hibernate内置缓存中,只有 JBossCache支持事务型缓存.

七、Hibernate的延迟加载

1、在有关联的持久类对象中,对一个对象进行的查询也会向另一个对象进行查询
2、所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作
3、hibernate 3.Xlazy(延迟加载)默认值是true,需要注意
4、延迟加载类型
            - 实体对象的延迟加载
         - 集合的延迟加载
         - 属性的延迟加载

0 0