Hibernate 3.0 的一级缓存和二级缓存总结

Hiberante3  一级缓存总结
1.2.3.使用HQLSQL是查询属性级别的,是不使用一级缓存的!切记!!!!
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 是不支持分布应用的,如果有分布式需求,请换成支持分布式的二级缓存产品,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 开发手册中搜索这个关键字,可以找到一级缓存和二级缓存交互使用的问题;

猜你喜欢

转载自yali-wang.iteye.com/blog/1814698