zoukankan      html  css  js  c++  java
  • Hibernate缓存详解

    Hiberante3 一级缓存总结

    1.Session 级别的缓存,它同session邦定。它的生命周期和session相同。Session消毁,它也同时消毁;管理一级缓存,一级缓存无法取消,用两个方 法管理,clear(),evict()

    2. 两个session 不能共享一级缓存,因它会伴随session的生命周期的创建和消毁;

    3.Session缓存是实体级别的缓存,就是只有在查询对象级别的时候才使用,如果

    使用HQL和SQL是查询属性级别的,是不使用一级缓存的!切记!!!!

    4 .iterate 查询使用缓存,会发出查询Id的SQL和HQL语句,但不会发出查实体的,

    它查询完会把相应的实体放到缓存里边,一些实体查询如果缓存里边有,就从缓存中查询,但还是会发出查询id的SQL和HQL语句。如果缓存中没有 它会数据库中查询,然后将查询到的实体一个一个放到缓存中去,所以会有N+1问题出现。

    5 List()和iterate 查询区别:

    使用iterate,list查询实体对象*N+1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题

    所谓的N+1是在查询的时候发出了N+1条sql语句1:首先发出一条查询对象id列表的sqlN:

    根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句list和iterate的区别?

    list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据

    iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题

    6.Get()和load(),iterate方法都会使用一级缓存,



    7.hiberate3 session 存储过程如下:

    例如 object 对象

    Session.save(object);

    这时候不会把数据放到数据库,会先放到session缓存中去,数据库中没有相应记录,session.flush();才发SQL和HQL语句,数据库 中有了相应记录,

    但是数据库用select查不到,这是跟数据库事物级别有关系,(这里在说下数据库的事务隔离级别一共四种如下:)
    数据库隔离级别:
    隔离级别                       是否存在脏读  是否存在不可重复读     是否存在幻读;
    Read UnCommited(未提交读)               Y            Y                     Y
    Read Commited (提交读 oraclel默认)      N            Y                     Y
    Repeatable Read(不可重复读(Msql默认))  N            N                     Y
    Serializable(使用很少)                  N            N                     N



    Session.beginTrransaction().commit();

    事物提交后可以查询到了。

    Session.flush()语句但是为什么不写呢,因为commit()会默认调用flush();

    Hiberante3 二级缓存总结

    1.Hibernate3的(sessionFactory)二级缓存和session级别的缓存一样都只对实体对象做缓存,不对属性级别的查询 做缓存;二级缓存的生命周期和sessionFactory的生命周期是一样的,sessionFactory可以管理二级缓存;

    2.sessionFactory级别的缓存,需要手动配置;所有的session可以共享sessionFactory 级别的缓存;(一般把一些不经常变化的实体对象放到sessionFactory级别的缓存中,适合放不经常变化的实体对象。)

    3.Hiberante3二级缓存的配置和使用方法如下:

    1. 必须把ehcache.jar包导入,然后到Hibernate3.2的etc文件下把ehcache.xml复制到工程src目录下 (ehcache.xml里边的参数里边有详细英文说明);

    (说明:ehcache.jar是第三方法的缓存产品,hiberante只是把它做了集成,还有好多第三方hibernate集成的缓存产品, 相关说明请查阅hiberante3开发手册;ehcache支持分布应用的(这个和Hibernate3.2开发手册有出入,经过官网查证确实支持 了),如果有分布式需求,请换成支持分布式的二级缓存产品,hiberate3开发手册都有相头说明。配置方法都类似);

    4.Hibernate3的二级缓存默认是开起的,也可以指定开起。在hibernate.cfg.xml 文件下配置如下:

    *修改hibernate.cfg.xml文件,开户二级缓存;
    <property name=”hibernate.cache.use_second_level_cache”>true</property>

    *指定二级缓存产品的提供商;

    <property name=”hibernate.cache.provider_class”> org.hibernate.cache.EhCacheProvider

    </property>

    要让那些实体使用二级缓存,在hibernate.cfg.xml配置文件中加入:

    <!—

    让这个实体用二级缓存 也可以在实体中映射文件去配置即:

    <cache usage="read-only"/>

    -->

    <class-cache class=”com.zzz.hibernate.ClassT” usage=”read-only”/>

    Read-only一般使用这个策略,其它的hibernate3开发手册中也有详细介绍;

    CacheMode去hibernate3开发手册中搜索这个关键字,可以找到一级缓存和二级缓存交互使用的问题;
  • 相关阅读:
    Windows Azure Storage (17) Azure Storage读取访问地域冗余(Read Access – Geo Redundant Storage, RA-GRS)
    SQL Azure (15) SQL Azure 新的规格
    Azure China (5) 管理Azure China Powershell
    Azure China (4) 管理Azure China Storage Account
    Azure China (3) 使用Visual Studio 2013证书发布Cloud Service至Azure China
    Azure China (2) Azure China管理界面初探
    Azure China (1) Azure公有云落地中国
    SQL Azure (14) 将云端SQL Azure中的数据库备份到本地SQL Server
    [New Portal]Windows Azure Virtual Machine (23) 使用Storage Space,提高Virtual Machine磁盘的IOPS
    Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400334.html
Copyright © 2011-2022 走看看