一、缓存简介 Cache In Hibernate
HIBERNATE 中的 CACHE 有两级 .
一级是在 Session 范围内的 CACHE . 即每个 Session 有自己的一个 CACHE, 当前操作的对象都会被保留在 CACHE 中 . 但是 Session 关闭后这个 CACHE 也就没有 . 可见这级 CACHE 的生命期是很短的 . (使用 id 进行关键字存储:缓存的 key 就是 ID , value 是 POJO ) ( 缓存的是实体对象 )
另一级 CACHE 是在 SessionFactory 范围的 , 可以被来自同一个 SessionFactory 的 Session 共享 . 在 HIBERNATE 的文档中称其为 SECOND LEVEL CACHE. 显然后者的优势较明显 , 也比较复合当前的使用环境 . 它可以使用不同的缓存实现,如 EhCache 、 JBossCache 、 OsCache 等 (二级缓存是缓存实体对象的)
还有一个类型的 CACHE 就是 QueryCache . 它的作用就是缓存一个 Query 以及 Query 返回对象的 Identifier 以及对象的类型 . 有了 QueryCache 后就可以高效的使用 SECOND LEVEL CACHE.
hibernate 查询缓存 (hibernate 默认是关闭的 )
查询缓存是针对普通属性结果集的缓存
对实体对象的结果集只缓存 id
查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
1. 启用查询缓存:在 hibernate .cfg.xml 中加入:
<property name=”hibernate .cache.use_query_cache”>true</property>
2. 在程序中必须手动启用查询缓存,如: query.setCacheable(true);
QueryCache 用来缓存查询语句 , 及查询结果集中对象的 Identifier 与 Type. 当再次使用已缓存的 Query 时 , 就可以通过对象的 Identifier 与 Type 在 SECOND LEVEL CACHE 中查找实际的对象 .
对于查询缓存来说,缓存的 key 是根据 hql 生成的 sql ,再加上参数,分页等信息(可以通过日志输出看到,不过它的输出不是很可读,最好改一下它的代码)。
注:一级缓存也叫 session 级的缓存或事务缓存。 Hibernate 二级缓存也称为进程级的缓存或 SessionFactory 级的缓存。二级缓存是全局缓存,它可以被所有的 session 共享。二级缓存的生命周期和 SessionFactory 的生命周期一致, SessionFactory 可以管理二级缓存。
二、缓存的范围
缓存的范围分为 3 类 :
1. 事务范围
事务范围的缓存只能被当前事务访问 , 每个事务都有各自的缓存 , 缓存内的数据通常采用相互关联的对象形式 . 缓存的生命周期依赖于事务的生命周期 , 只有当事务结束时 , 缓存的生命周期才会结束 . 事务范围的缓存使用内存作为存储介质 , 一级缓存就属于事务范围 .
2. 应用范围
应用程序的缓存可以被应用范围内的所有事务共享访问 . 缓存的生命周期依赖于应用的生命周期 , 只有当应用结束时 , 缓存的生命周期才会结束 . 应用范围的缓存可以使用内存或硬盘作为存储介质 , 二级缓存就属于应用范围 .
3. 集群范围
在集群环境中 , 缓存被一个机器或多个机器的进程共享 , 缓存中的数据被复制到集群环境中的每个进程节点 , 进程间通过远程通信来保证缓存中的数据的一致 , 缓存中的数据通常采用对象的松散数据形式 .
三、缓存的方式
有四种,分别为:
CacheConcurrencyStrategy.NONE
CacheConcurrencyStrategy.READ_ONLY ,只读模式,在此模式下,如果对数据进行更新操作,会有异常;
CacheConcurrencyStrategy.READ_WRITE ,读写模式在更新缓存的时候会把缓存里面的数据换成一个锁,其它事务如果去取相应的缓存数据,发现被锁了,直接就去数据库查询;
CacheConcurrencyStrategy.NONSTRICT_READ_WRITE ,不严格的读写模式则不会的缓存数据加锁;
CacheConcurrencyStrategy.TRANSACTIONAL ,事务模式指缓存支持事务,当事务回滚时,缓存也能回滚,只支持 JTA 环境。
缓存的注释写法如下,加在 Entity 的 java 类上:
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
分享到:
相关推荐
#hibernate.dialect org.hibernate.dialect.Cache71Dialect #hibernate.connection.driver_class com.intersys.jdbc.CacheDriver #hibernate.connection.username _SYSTEM #hibernate.connection.password SYS #...
《Hibernate in Action》是一本深度探讨Java持久化框架Hibernate的专业书籍。Hibernate作为Java领域最流行的ORM(对象关系映射)工具之一,它极大地简化了数据库操作,使得开发者能够以面向对象的方式处理数据。这...
#### 十六、Hibernate in Spring - **Spring框架与Hibernate的整合**: Spring提供了一种简单的机制来管理和配置Hibernate。 - **优点**: - 事务管理统一。 - 自动化Bean装配。 - 方便的异常转换。 #### 十七、...
- **Second-Level and Query Cache**: Describes how to enable and configure Hibernate's second-level cache and query cache for improved performance. - **Query Language Substitution**: Explains how to ...
这本书的第二版,作为"In Action"系列的经典之作,旨在帮助开发者更高效地理解和运用Hibernate技术。 本书的知识点涵盖了以下几个主要部分: 1. Hibernate基础:介绍Hibernate的基本概念,包括ORM思想、项目配置、...
10. **Second-Level Cache**:讨论Hibernate的二级缓存机制,提高数据访问性能。 11. **Hibernate与Web应用集成**:讲解如何在Servlet、JSP、Spring MVC等Web框架中集成Hibernate,以及如何处理异常。 12. **性能...
- **文档说明**: 文档版本为1.0,由夏昕撰写,主要修订内容包括错误修正及添加了“Hibernate in Spring”的相关内容。文档强调了其开源性质,并鼓励读者提出改进建议。 - **目录概览**: - **准备工作**: 包括环境...
System.out.println("Object not found in cache."); } // 关闭CacheManager cacheManager.shutdown(); } } class MyObject { // ... } ``` 在上述代码中,我们首先通过`CacheManager.create()`创建了一个...
- Hibernate4中,如果你在进行分页查询时遇到“ResultSet may only be accessed in a forward direction”的错误,这是因为结果集默认只能向前滚动。为了解决此问题,可以在Hibernate配置中设置`jdbc.use_...
本文将深入探讨Hibernate性能优化中的一个重要概念——一级缓存,并结合给出的压缩包文件“hibernate_cache_level1”,来详细解析一级缓存的工作原理及其优化策略。 一级缓存是Hibernate内置的一种缓存机制,它存在...
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory <property name="hibernate.cache.use_second_level_cache">true <property name="hibernate.cache.use_...
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider <!-- Echo all executed SQL to stdout --> <property name="show_sql">true <!-- Mapping files --> </hibernate-...
- **Hibernate in Spring**:Spring框架可以方便地管理Hibernate Session的生命周期,并与其他Spring组件协同工作。 #### 四、总结 本文档不仅是一份Hibernate的学习指南,也是作者多年实战经验的总结。通过阅读这...
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider <!-- Echo all executed SQL to stdout --> <property name="show_sql">true <!-- Mapping files --> </hibernate-...
- **Hibernate in Spring**:介绍如何将Hibernate集成到Spring框架中,利用Spring的依赖注入和事务管理特性,简化Hibernate的配置和使用,提高开发效率和代码的可维护性。 《Hibernate开发指南》一书不仅提供了理论...
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider <!-- Echo all executed SQL to stdout --> <property name="show_sql">true <!-- Drop and re-create the database schema on ...
#### 十四、Hibernate in Spring Spring 框架可以很好地与 Hibernate 集成,Spring 提供了多种方式来管理 Hibernate 的 `SessionFactory` 和 `Session`,使得开发更加便捷。 #### 结语 本指南覆盖了 Hibernate 的...