`
liwanchun_xd
  • 浏览: 124665 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

Hibernate之Cache学习笔记

阅读更多
Hibernate 中实现了良好的Cache 机制,我们可以借助Hibernate 内部的Cache迅速提高系统数据读取性能。

需要注意的是:Hibernate做为一个应用级的数据访问层封装,只能在其作用范围内保持Cache中数据的的有效性,也就是说,在我们的系统与第三方系统共享数据库的情况下,Hibernate的Cache机制可能失效。一个很简单的例子,如果你用access修改了库中的值,那么这就不会更新JVM中的缓冲池,这就导致了赃数据的产生。

Hibernate 在本地JVM 中维护了一个缓冲池,并将从数据库获得的数据保存到池中以供下次重复使用(如果在Hibernate中数据发生了变动,Hibernate同样也会更新池中的数据版本)。此时,如果有第三方系统对数据库进行了更改,那么,Hibernate并不知道数据库中的数据已经发生了变化,也就是说,池中的数据还是修改之前的版本,下次读取时,Hibernate会将此数据返回给上层代码,从而导致潜在的问题。外部系统的定义,并非限于本系统之外的第三方系统,即使在本系统中,如果出现了绕过Hibernate数据存储机制的其他数据存取手段,那么Cache的有效性也必须细加考量。如,在同一套系统中,基于Hibernate和基于JDBC的两种数据访问方式并存,那么通过JDBC更新数据库的时候,Hibernate同样无法获知数据更新的情况,从而导致脏数据的出现。

基于Java 的Cache 实现,最简单的莫过于HashTable,hibernate 提供了基于Hashtable 的Cache 实现机制,不过,由于其性能和功能上的局限,仅供开发调试中使用。同时,Hibernate 还提供了面向第三方Cache 实现的接口,如JCS、EHCache、OSCache、JBoss Cache、SwarmCache等。

Hibernate中的Cache大致分为两层,第一层Cache在Session实现,属于事务级数据缓冲,一旦事务结束,这个Cache 也就失效。此层Cache 为内置实现,无需我们进行干涉。第二层Cache,是Hibernate 中对其实例范围内的数据进行缓存的管理容器。

我们主要学习第二层Cache。

Hibernate早期版本中采用了JCS(Java Caching System -Apache Turbine项目中的一个子项目)作为默认的第二层Cache实现。由于JCS的发展停顿,以及其内在的一些问题(在某些情况下,可能导致内存泄漏以及死锁),新版本的Hibernate已经将JCS去除,并用EHCache作为其默认的第二级Cache实现。相对JCS,EHCache更加稳定,并具备更好的缓存调度性能,缺陷是目前还无法做到分布式缓存,如果我们的系统需要在多台设备上部署,并共享同一个数据库,必须使用支持分布式缓存的Cache实现(如JCS、JBossCache)以避免出现不同系统实例之间缓存不一致而导致脏数据的情况。Hibernate对Cache进行了良好封装,透明化的Cache机制使得我们在上层结构的实现中无需面对繁琐的Cache维护细节。

目前Hibernate支持的Cache实现有:

HashTable:net.sf.hibernate.cache.HashtableCacheProvider  支持查询缓冲。

EHCache:net.sf.ehcache.hibernate.Provider 支持查询缓冲。

OSCache:net.sf.hibernate.cache.OSCacheProvider 支持查询缓冲。

SwarmCache:net.sf.hibernate.cache.SwarmCacheProvider 支持集群。

JBossCache:net.sf.hibernate.cache.TreeCacheProvider 支持集群。

其中SwarmCache 提供的是invalidation 方式的分布式缓存,即当集群中的某个节点更新了缓存中的数据,即通知集群中的其他节点将此数据废除,之后各个节点需要用到这个数据的时候,会重新从数据库中读入并填充到缓存中。而JBossCache提供的是Reapplication式的缓冲,即如果集群中某个节点的数据发生改变,此节点会将发生改变的数据的最新版本复制到集群中的每个节点中以保持所有节点状态一致。

使用第二层Cache,需要在hibernate的配置文件进行配置(省略)主要介绍一下cache策略

cache策略可选值有以下几种:

1. read-only 只读。
2. read-write 可读可写。
3. nonstrict-read-write  如果程序对并发数据修改要求不是非常严格,只是偶尔需要更新数据,可以采用本选项,以减少无谓的检查,获得较好的性能。
4. transactional 事务性cache。在事务性Cache 中,Cache 的相关操作也被添加到事务之中,如果由于某种原因导致事务失败,我们可以连同缓冲池中的数据一同回滚到事务开始之前的状态。目前Hibernate 内置的Cache 中,只有JBossCache 支持事务性的Cache实现。

其他参数简介:

maxElementsInMemory="10000"     //Cache中最大允许保存的数据数量
eternal="false"                                      //Cache中数据是否为常量
timeToIdleSeconds="120"                 //缓存数据钝化时间
timeToLiveSeconds="120"                //缓存数据的生存时间
overflowToDisk="true"                        //内存不足时,是否启用磁盘缓存


需要注意的是Hibernate 的数据库查询机制。我们从查询结果中取出数据的时候,用的最多的是两个方法:Query.list();Query.iterate();

对于list方法而言,实际上Hibernate是通过一条Select SQL获取所有的记录。并将其读出,填入到POJO中返回。

而iterate 方法,则是首先通过一条Select SQL 获取所有符合查询条件的记录的id,再对这个id 集合进行循环操作,通过单独的Select SQL 取出每个id 所对应的记录,之后填入POJO中返回。

也就是说,对于list 操作,需要一条SQL 完成。而对于iterate 操作,需要n+1条SQL。

看上去iterate方法似乎有些多余,但在不同的情况下确依然有其独特的功效,如对海量数据的查询,如果用list方法将结果集一次取出,内存的开销可能无法承受。另一方面,对于我们现在的Cache机制而言,list方法将不会从Cache中读取数据,它总是一次性从数据库中直接读出所有符合条件的记录。而iterate 方法因为每次根据id获取数据,这样的实现机制也就为从Cache读取数据提供了可能,hibernate首先会根据这个id 在本地Cache 内寻找对应的数据,如果没找到,再去数据库中检索。


资料:Hibernate 开发指南

分享到:
评论
1 楼 Joo 2008-05-09  
为什么没有提到memcached呢

相关推荐

    hibernate个人学习笔记完整版

    【hibernate个人学习笔记完整版】是一份详尽的资料,涵盖了Hibernate框架的基础到高级应用,旨在帮助学习者深入理解和掌握这一强大的Java对象关系映射(ORM)工具。Hibernate作为Java开发中的主流ORM框架,它极大地...

    Hibernate4学习笔记1

    **Hibernate4 学习笔记** Hibernate4 是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。在这个学习笔记中,我们将深入探讨Hibernate4的二级缓存机制、访问策略以及一些主要的新...

    Hibernate学习的笔记

    【Hibernate学习笔记】 Hibernate 是一个流行的 Java 应用程序框架,用于对象关系映射(ORM),它简化了数据库操作,使开发人员能够使用面向对象的编程模型而不是直接编写 SQL 语句。以下是从标题和描述中提取的 ...

    韩顺平hibernate笔记

    此外,笔记还可能涉及到Hibernate的二级缓存机制,包括SessionFactory级别的Cache和Query级别的Cache,以及常用的缓存提供商如Ehcache和Infinispan的配置和使用。缓存机制对于提高应用性能至关重要,尤其是在大数据...

    hibernate学习笔记第三天的源码

    在深入探讨Hibernate学习笔记第三天的源码之前,先让我们简单了解一下Hibernate。Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了一种方便的方式来管理数据库操作。通过Hibernate,开发人员...

    hibernate学习笔记

    《Hibernate学习笔记详解》 Hibernate,作为Java领域中的一款强大持久化框架,为开发者提供了对象-关系映射(ORM)的解决方案,极大地简化了数据库操作。这篇笔记将深入探讨Hibernate的核心概念、映射关系和内存...

    Hibernate学习笔记

    ### Hibernate学习笔记知识点详解 #### 一、主配置文件解析 **1.1 配置文件结构** 在提供的配置文件中,我们首先看到的是主配置文件的声明与DTD定义,这是标准的XML文档声明和DTD定义,用于指定文档类型及版本。 ...

    struts+spring+hibernate 整合笔记

    ### Struts + Spring + Hibernate 整合笔记 #### 前言 随着企业级应用的不断发展壮大,单一框架已经难以满足复杂多变的业务需求。因此,将多种框架进行有机整合成为了开发高效率、高性能应用的重要手段之一。本...

    hibenate学习笔记

    【hibernate学习笔记】 在Java开发中,Hibernate是一个非常重要的ORM(对象关系映射)框架,它使得Java程序员能够更方便地将程序中的对象与关系数据库进行交互,避免了传统JDBC编程的繁琐和低效。这篇学习笔记将带...

    java常用框架学习笔记

    ### Java常用框架学习笔记 #### Hibernate ##### 1.1 Hibernate 实现数据库操作步骤 - **导入所需的Jar包**:为了使用Hibernate框架,首先需要在项目中导入Hibernate库。这通常意味着添加一系列与Hibernate相关的...

    缓存框架-Ehcache学习笔记

    **缓存框架 Ehcache 学习笔记** Ehcache 是一个广泛使用的开源 Java 缓存框架,它在处理大量数据的高性能应用中扮演着重要角色。Ehcache 提供了本地内存缓存、磁盘存储以及分布式缓存的能力,使得应用程序能够快速...

    HibernateGossip(Hibernate 3 學習筆記).zip

    这个“HibernateGossip”学习笔记可能是对 Hibernate 3 版本的详细教程,涵盖了核心概念、配置、实体映射、查询以及事务管理等多个方面。 **核心概念** 1. **实体(Entities)**: 实体是 Hibernate 中对应数据库表...

    Spring学习笔记(内含代码)

    这个“Spring学习笔记(内含代码)”包含了作者在深入研究Spring框架过程中所做的详细记录,旨在帮助初学者和有经验的开发者更好地理解和应用Spring。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI...

    mybatis学习笔记

    ### MyBatis学习笔记知识点概览 #### 1. MyBatis入门 ##### 1.1 单独使用JDBC编程问题总结 - **JDBC程序示例**:通过一个具体的示例展示了如何使用JDBC连接数据库并执行SQL查询。 - 加载数据库驱动 - 获取数据库...

    java 框架技术

    这篇笔记将深入探讨Struts2的标签库和Hibernate的基本用法。 Struts2是一个强大的Web应用框架,它基于MVC设计模式,为开发者提供了丰富的控制层解决方案。其核心在于Action类,通过Action类处理用户请求并返回结果...

    计算机组成原理avaWe开发笔记

    《计算机组成原理与JavaWeb开发笔记》 在深入学习JavaWeb开发之前,了解计算机组成原理是至关重要的。计算机组成原理是计算机科学的基础,它涵盖了计算机系统的基本架构、数据表示、运算器设计、存储系统、指令系统...

    jpa 全面学习资料

    学习笔记可能涉及更深入的话题,如: - **懒加载(Lazy Loading)与急加载(Eager Loading)**: 管理关联对象的加载时机。 - **继承映射(Inheritance Mapping)**: 包括单表继承、联合继承和表格派生。 - **复合...

    jive.chm

    2 jcs学习笔记 3 关于Hibernate的Cache问题 4 用缓冲技术提高JSP应用的性能和稳定性 5 SwarmCache入门 <br> 源代码研究 1 Jive中的全局配置 2 Jive源代码情景分析-index....

Global site tag (gtag.js) - Google Analytics