`
- 浏览:
241786 次
- 性别:
- 来自:
广州
-
Hibernate脏数据检查
何谓脏数据(Dirty Data)?
这里的"脏"可能有些误解,脏数据并不是说非废弃或者无用的数据,而是指一个数据对象所携带的信息发生了改变之后的状态.
事务提交时,HIbernate会对Session中的PO进行检测,判断那些发生了变化,并装发生变化的数据更新到数据库中.
脏数据的检查一般策略大致有下面两种:
数据对象监控
数据对象监控的实现方式,大体上是通过拦截器对数据对象的设值方法(setter)进行拦截,拦截器的实现可以借助Dynamic Proxy或者CGlib实现.一旦数据对象的设置方法被调用(通常这也意味着数据对象的内容发生变化),则将其标志为"待更新"状态,之后在数据库操作时将其更新到对应的库表.
数据版本比较
在持久层框架中维持数据对象的最近读取版本,当数据提交时数据与些版本进行比对
时,如果发生变化则将期同步到数据库相应的库表.
Hibernate采取的是第二种检查策略
数据缓存
概述
缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库与数据访问层之间,缓存(Cache)往往是提升系统性能的关键因素.
数据缓存策略
ORM数据缓存应包含以下几个层次的内容:
事务级缓存(Transaction Layer Cache)
应用级/进程级缓存(Application/Process Layer Cache)
分布式缓存(Cluster Layer Cache)
事务级缓存
这里的事务可能是一个数据库事务,也可能是某个应用级事务.对于Hibernate而言,事务级缓存是基于Session生命周期实现的.每个Session会在内部维持一个数据缓存,此缓存随着Session的创建(销毁)而存在(消亡),因此也叫Session Level Cache(也称内部缓存)
应用级缓存
此缓存可由多个事务(数据事务或者应用级事务)共享,事务之间的缓存共享策略与应用的事务隔离机制密切相关.在Hibernate中,应用级缓存在SessionFactory层实现,所有由此SessionFactory创建的Session实例共享此缓存,因此也称为SessionFactory Level Cache.
分布式缓存
分布式缓存由多个应用级缓存实例组成集群,通过某种远程机制(如RMI或JMS)实现各个缓存实例间的数据同步,任何一个实例的数据修改操作,将导致整个集群间的数据状态同步.
需要注意的是,如果当前的应用与其他应用共享数据库,也就是说,在当前应用过程中,其他应用可能同时更新数据库,那么缓存策略的制定就需要格外小心了,这种情况下,一般采取一些保守策略可能会更加稳妥.
Hibernate数据缓存
以Hibernate主义加以区分,Hibernate数据缓存可分为以下两个层次:
内部缓存(Session Level,也称一级缓存)
二级缓存(SessionFactory Level,也称为二级缓存)
Hibernate中,缓存将在以下情况中发挥作用:
通过主键id加载数据.这包括根据id查询数据的Session.load方法,以及Session.iterate等 批量查询方法(Session.iterate进行查询时,也是根据id在缓存 中查找数据,类似一个Session.load循环).
延迟加载
内部缓存
Session在内部维护了一个Map数据类型,些数据类型中保持了所有与当前Session相关联对象.
内部缓存正常情况下由Hibernate自动维护,如果需要手动干预,我们可以通过以下方法完成:
Session.evict
将某个特定的对象从内部缓存中清除
Session.clear
清空内部缓存
二级缓存
在引入二级缓存时,应该考虑以下问题:
数据库是否与其他应用共享
应用是否需要部署在集群环境中.
如果满足以下条件,将纳入缓存管理:
数据不会被第三方应用修改
数据大小(Data Size)在可接受的范围之内.
数据更新频率较低
同一数据可能会被系统频繁引用.
非关键数据(关键数据,如金融帐户数据)。
第三方缓存实现
Hibernate本身并未提供二级缓存的产品化实现,而是为众多的第三方缓存组件提供了接入接口,较常用的第三方组件有:1. JCS2. EHCache3. OSCache4. JBossCache5. SwarmCacheHibernate中启用二级缓存,需要在hibernate.cfg.xml配置hibernate.cache.provider_class参数,之后,需要在映射文件中指定各个映射实体(以及collection)的缓存同步策略。Hibernate提供了一下4种内置的缓存同步策略:1. read-only只读。对于不会发生改变的数据,可使用只读型缓存。2. nonstrict-read-write如果程序对并发访问下的数据同步要求不是非常严格,且数据更新操作频率较低,可以采用本选项,获得较好的性能。3. read-write严格可读写缓存。基于时间戳判定机制,实现了“read committed”事务隔离等级。可用于对数据同步要求严格的情况,但不支持分布式缓存。这也是实际应用中使用最多的同步策略。4. transactional事务型缓存,必须运行在JTA事务环境中。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
### Hibernate的映射、三态、脏数据、Session缓存详解 #### 一、Hibernate映射 **Hibernate映射**是Hibernate框架的核心功能之一,它实现了Java对象与数据库表之间的映射关系。通过这种方式,开发人员可以使用面向...
本篇将详细探讨如何使用Hibernate ORM框架结合EhCache实现数据缓存的处理,从而提高系统的响应速度。 Hibernate是一个流行的Java持久化框架,它提供了一种便捷的方式来映射对象关系模型(ORM)到关系数据库。然而,...
- **数据更新**:对于频繁更新的数据,使用二级缓存的意义不大,因为需要频繁同步缓存与数据库,反而可能导致数据不一致。 - **范围分类**:二级缓存分为事务范围、进程范围和集群范围: - **事务范围**:只对当前...
### Hibernate使用缓存时的数据同步问题详解 #### 引言 在现代软件开发中,ORM框架如Hibernate被广泛应用于数据库操作,以简化Java应用程序与数据库之间的交互。然而,使用Hibernate时,缓存机制的合理配置对于...
Hibernate 是一个流行的对象关系映射(ORM)框架,它提供了数据缓存机制以优化数据库访问性能。缓存机制分为一级缓存和二级缓存,两者都有助于减少对物理数据库的直接访问,从而提高应用程序的运行效率。 一级缓存...
Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...
2. **立即更新策略**:无论读还是写,都会立即更新缓存,保证缓存与数据库数据同步。 3. **查询缓存**:针对特定SQL查询结果进行缓存,适用于查询结果稳定且不常改变的情况。 **五、缓存区域** Hibernate缓存可以...
然而,由于对象模型和关系型数据库模型之间的映射会产生一定的性能开销,Hibernate引入了一套缓存机制来提高数据访问的效率。 #### 二、Hibernate的缓存结构 Hibernate的缓存机制分为两层:第一级缓存(Session...
**标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...
缓存中存储的是数据库数据的副本,当需要查询数据时,Hibernate会首先在缓存中查找,如果找到,就直接返回,避免了数据库查询的开销。 **1. Hibernate缓存概述** Hibernate提供了两级缓存:一级缓存和二级缓存。一...
一级缓存是Hibernate中最基础的缓存层次,它的生命周期与Session绑定。当Session开启时,一级缓存被创建;当Session关闭或flush后清空时,一级缓存被销毁。一级缓存的使用无需任何配置,是Hibernate默认提供的缓存...
- **不保证数据一致性**:查询缓存不提供数据一致性保证,可能存在脏读问题。因此,适用于那些对实时性要求不高的场景。 ### 4. 缓存的配置与使用 在实际项目中,合理配置和使用缓存可以极大地提升应用性能。这...
一级缓存的作用在于避免频繁地与数据库交互,提高效率。例如,当我们第一次从数据库加载一个实体后,再次请求该实体时,Hibernate会首先在一级缓存中查找,而不会去数据库查询,从而提高了性能。在实际项目中,合理...
这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当Session关闭时,一级缓存中的数据会丢失。二级缓存的存在减少了对数据库的直接访问,从而提高了数据读取速度。 为了启用Hibernate的二...
为了提高数据访问性能,Hibernate引入了缓存机制,它可以减少对数据库的直接访问,从而提升应用的响应速度。本文将详细讲解Hibernate缓存的原理、类型以及使用方法。 ### 1. Hibernate缓存概述 缓存是存储在内存中...
同样,当添加、更新或删除数据时,Hibernate也会同步更新缓存,以保持缓存与数据库数据的一致性。如果需要手动管理缓存,例如避免过多对象占用内存,可以使用evict()方法从一级缓存中移除对象。 总结来说,...
#### 四、缓存配置与实现 为了实现Hibernate的缓存功能,需要进行以下步骤的配置: 1. **引入缓存组件**:例如使用EhCache作为二级缓存的实现,需要添加对应的jar包(如`ehcache.jar`)。 2. **配置缓存参数**:在...
在Java应用程序中,Hibernate 提供了一种便捷的方式,将数据模型类与数据库表进行映射,使得开发者无需直接编写SQL,而是通过对象操作来处理数据库事务。 ### Hibernate 缓存 缓存是提升应用程序性能的关键技术之...
Hibernate 二级缓存是针对SessionFactory级别的全局缓存,与一级缓存(Session级别)不同,一级缓存只在单个Session生命周期内有效。二级缓存则允许不同Session之间共享数据,提高了数据访问效率,减少了对数据库的...