mybatis缓存机制与hibernate缓存机制

mybatis缓存分为1级缓存和2级缓存,2级缓存在sessionfactory中,1级缓存在session中。html

  1. session中的缓存在session链接关闭并被链接池回收时清理,或者手动清理java

  2. sessionfactory中的缓存须要在mybatis配置文件中手动配置,配置以下:sql


  3. <setting name="cacheEnabled" value="true"/>
<mapper namespace="dao.userdao">
   ...  select statement ...       <!-- Cache 配置 -->
    <cache        
        eviction="FIFO"
        flushInterval="60000"
        size="512"
        readOnly="true" />
</mapper>

flushInterval:刷新轮询时间,每隔这个时间后缓存被清理一次。数据库


参考博客园地址:http://www.cnblogs.com/zemliu/archive/2013/08/05/3239014.html 缓存

hiberante缓存机制:
1、why(为何要用Hibernate缓存?)session

Hibernate是一个持久层框架,常常访问物理数据库。mybatis

为了下降应用程序对物理数据源访问的频次,从而提升应用程序的运行性能。并发

缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。app


2、what(Hibernate缓存原理是怎样的?)Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存。框架

1.Hibernate一级缓存又称为“Session的缓存”。

Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期一般对应一个数据库事务或者一个应用事务)。

一级缓存中,持久化类的每一个实例都具备惟一的OID。

2.Hibernate二级缓存又称为“SessionFactory的缓存”。

因为SessionFactory对象的生命周期和应用程序的整个过程对应,所以Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,所以须要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。

第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。

Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。

什么样的数据适合存放到第二级缓存中?   

1) 不多被修改的数据   

2) 不是很重要的数据,容许出现偶尔并发的数据   

3) 不会被并发访问的数据   

4) 常量数据   

不适合存放到第二级缓存的数据?   

1) 常常被修改的数据   

2) 绝对不容许出现并发访问的数据,如财务数据,绝对不容许出现并发   

3) 与其余应用共享的数据。

3.Session的延迟加载实现要解决两个问题:正常关闭链接和确保请求中访问的是同一个session。

Hibernate session就是java.sql.Connection的一层高级封装,一个session对应了一个Connection。

http请求结束后正确的关闭session(过滤器实现了session的正常关闭);延迟加载必须保证是同一个session(session绑定在ThreadLocal)。

4.Hibernate查找对象如何应用缓存?

当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;

查不到,若是配置了二级缓存,那么从二级缓存中查;

若是都查不到,再查询数据库,把结果按照ID放入到缓存删除、更新、增长数据的时候,同时更新缓存。

参考:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html


hibernate与mybatis对比:

首先简单介绍下二者的概念:

Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装。

Mybatis:Mybatis一样也是很是流行的ORM框架,主要着力点在于POJO 与SQL之间的映射关系。

其次具体从几个方面说一下二者的区别:

1.二者最大的区别:

针对简单逻辑,Hibernate和MyBatis都有相应的代码生成工具,能够生成简单基本的DAO层方法。

针对高级查询,Mybatis须要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,能够更专一于业务流程。

2.开发难度对比

Hibernate的开发难度要大于Mybatis。主要因为Hibernate比较复杂、庞大,学习周期较长。

而Mybatis则相对简单一些,而且Mybatis主要依赖于sql的书写,让开发者感受更熟悉。

3.sql书写比较

Mybatis的SQL是手动编写的,因此能够按需求指定查询的字段。不过没有本身的日志统计,因此要借助log4j来记录日志。

Hibernate也能够本身写SQL来指定须要查询的字段,但这样就破坏了Hibernate开发的简洁性。不过Hibernate具备本身的日志统计。

4.数据库扩展性比较

Mybatis因为全部SQL都是依赖数据库书写的,因此扩展性,迁移性比较差。

Hibernate与数据库具体的关联都在XML中,因此HQL对具体是用什么数据库并非很关心。

5.缓存机制比较

相同点:Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,均可以经过实现你本身的缓存或为其余第三方缓存方案,建立适配器来彻底覆盖缓存行为。

不一样点:Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,而后再在具体的表-对象映射中配置是那种缓存。

MyBatis的二级缓存配置都是在每一个具体的表-对象映射中进行详细配置,这样针对不一样的表能够自定义不一样的缓存机制。而且Mybatis能够在命名空间中共享相同的缓存配置和实例,经过Cache-ref来实现。

二者比较:由于Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。因此在使用二级缓存时若是出现脏数据,系统会报出错误并提示。

而MyBatis在这一方面,使用二级缓存时须要特别当心。若是不能彻底肯定数据更新操做的波及范围,避免Cache的盲目使用。不然,脏数据的出现会给系统的正常运行带来很大的隐患。

6.总结:

Hibernate与MyBatis均可以是经过SessionFactoryBuider由XML配置文件生成SessionFactory,而后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。

而MyBatis的优点是MyBatis能够进行更为细致的SQL优化,能够减小查询字段,而且容易掌握。

Hibernate的优点是DAO层开发比MyBatis简单,Mybatis须要维护SQL和结果映射。数据库移植性很好,MyBatis的数据库移植性很差,不一样的数据库须要写不一样SQL。有更好的二级缓存机制,可使用第三方缓存。MyBatis自己提供的缓存机制不佳。

相关文章
相关标签/搜索