Hibernate的ReadWriteCache分析及在集群环境下之分析:
ReadWriteCache与读写锁:
ReadWriteCache从名字上看,我们联想到该实现与读写锁有关。读写锁的特征,可并发读,读写互斥,写互斥。
读方法的比较:
读方法实现如下:
public synchronized Object get(Object key, long txTimestamp) throws CacheException {
Lockable lockable = (Lockable) cache.get(key);
boolean gettable = lockable!=null && lockable.isGettable(txTimestamp);
if (gettable) {
return ( (Item) lockable ).getValue();
}
return null;
}
1.如果单纯从该方法的声明来说,该方法是同步的,显然不满足读写锁并发读的特性。但是仔细考虑,并发的范围是什么,如果我们把并发的范围放大到事务呢,那么是满足并发读这个条件的。
2.从读写互斥的角度看,当存在写锁的时候,获得读锁的调用将会被阻塞直到写锁被释放。首先,这段代码不存在获得读锁的调用,我们注意到判断lockable.isGettable(txTimestamp),这个判断所达到的目的,当存在对Cache数据的修改操作时,读无效。
从而,达到读写互斥的目的。
因此,get方法是满足读并发,读写互斥的条件的。
写方法的比较:
写方法实现如下:
public synchronized boolean put(
Object key,
Object value,
long txTimestamp,
Object version,
Comparator versionComparator,
boolean minimalPut)
throws CacheException {
try {
cache.lock(key);
Lockable lockable = (Lockable) cache.get(key);
boolean puttable = lockable==null ||
lockable.isPuttable(txTimestamp, version, versionComparator);
if (puttable) {
cache.put( key, new Item( value, version, cache.nextTimestamp() ) );
return true;
}
return false;
}
finally {
cache.unlock(key);
}
}
题外话,不同jvm实例下如何实现原子操作:
1.道理同一个jvm的情况,无非是对同一个资源的竞争。cache.lock(key),cache.unlock(key)所起到的作用就是跨jvm的同步,即是对key所标识的资源的竞争。
2.注意到调用:isPuttable,这个判读所达到的目的,当存在对Cache数据的修改操作时,那么写无效,从而达到写互斥的目的。如果我们仔细寻找代码。会发现,在删除和修改数据时,Hibernate在事务提交前会调用lock操作来产生写锁,从而阻塞了其它事务的读写,在事务提交后,才解锁。所以我们再一次发现,互斥范围是在事务范围而不是在实例方法调用范围。(但是,对于put方法,该实现并不是严格的事务范围互斥,在版本比较更新的时候,put调用会生效)
从上面分析看,该实现是遵照ReadWriteLock的工作方式的。
额外的关注:
txTimestamp,在会话构建的时候,会给每个会话分配一个timestamp,起到对会话标识以及排序的作用。
txTimestamp有序的作用:
1.对于实现可重复读隔离级别,由于cache数据可能被新的事务所覆盖,因此,如果老的事务
读取该cache数据,则不满足可重复读条件。在这种情况下,将读操作交有数据库来处理,则可满足事务隔离级别的要求。
(事实上,即使这么做也不能完全满足可重复读,如果第一次读从cache而不是数据库)
2.当解锁完成后,锁覆盖的判断。
概括来说,因为并发发生在事务范围,所以通过txTimestamp体现事务的有序性是必须的。
下面我们分析在集群环境下使用ReadWriteLock的现状以及需要做的工作。
目前,hibernate所提供的Cache实现中,没有一个实现了lock方法。所以是不能在集群环境下工作的。
必要充分条件:
1.cache实现事务唯一标识产生器,即nextTimestamp方法
2.cache实现lock,unlock,update方法,从实现跨jvm的资源竞争,达到跨jvm的同步的目的。
问题分析:
开销上,一次更新或删除操作,跨jvm的资源竞争操作大约有7次。唯一标识产生器调用有2次。
一次缓存写操作,跨jvm的资源竞争操作大约有2次。唯一标识产生器调用有1次。
锁超时的设置值多少为合理?
其它考虑:
如果按照下面的性能测试,使用memcached+ReadWriteCache还是值得考虑的
http://xmemcached.googlecode.com/svn/trunk/benchmark/benchmark.html
分享到:
相关推荐
标题:hibernate源码分析一[启动过程] 在深入探讨Hibernate框架的启动过程之前,我们首先需要了解几个核心的概念和类,它们是Hibernate启动流程的基石。 ### 1. 关键类与接口 #### Environment类 `Environment`类...
在深入分析 Hibernate 结构框架之前,我们先来了解一下核心概念。 **1. Hibernate 配置文件** Hibernate 的配置文件通常为 `hibernate.cfg.xml`,它定义了数据库连接、缓存、事务管理和映射文件的位置。例如,你...
在本文中,我们将对 Hibernate 的源码进行深入分析,并探讨其核心特性和技术实现。 架构 Hibernate 的架构可以分为三层:Presentation Layer、Business Logic Layer 和 Data Access Layer。Presentation Layer ...
Hibernate源代码分析 在 Hibernate 框架中,SessionFactory 和 ConnectionProvider 是两个非常重要的组件,了解它们的实现机制对于深入了解 Hibernate 的工作原理具有重要意义。本文将通过分析 Hibernate 的源代码...
2. 性能:由于Ibatis允许直接编写SQL,所以在某些情况下,其性能可能优于Hibernate,尤其是在复杂的查询和事务处理上。 3. 学习曲线:Hibernate的全面性使得学习成本较高,而Ibatis的“半自动化”特性使得学习相对...
在 Eclipse 中搭建 Hibernate 项目环境步骤 在本文中,我们将详细介绍如何在 Eclipse 中搭建 Hibernate 项目环境的步骤。Hibernate 是一个流行的 Java 持久层框架,提供了对数据库的访问和操作功能。通过本文,读者...
【Hibernate概述及实例分析】 Hibernate 是一款在Java环境中广泛应用的对象/关系数据库映射(ORM)框架,它将复杂的数据库操作转化为对Java对象的操作,简化了数据持久化的过程。ORM技术的核心在于将对象模型(如...
【标题】:“Hibernate环境搭建及第一个程序” 在Java开发领域,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用Java对象来处理数据,而无需编写大量的SQL语句。本教程将指导...
**hibernate源码分析:启动过程** 在深入探讨Hibernate启动过程之前,首先需要了解Hibernate是什么。Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发人员提供了一种在Java应用程序中操作数据库的方式...
**Hibernate源码分析** Hibernate,一个著名的开源Java对象关系映射(ORM)框架,通过将Java对象和数据库表之间的映射关系自动化,极大地简化了数据访问层的开发工作。本篇将深入探讨Hibernate的源码,揭示其执行...
了解并熟练掌握Hibernate项目环境的搭建,对于Java开发者而言,是提高开发效率、提升代码质量的关键技能之一。 #### 二、详细步骤:从零开始搭建Hibernate环境 ##### 1. **加载Hibernate类库和依赖库** - 下载...
**标题:“第一次搭建Hibernate环境”** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使开发者能够用Java对象来处理数据库事务。搭建Hibernate环境是开始使用该框架的第...
本文将指导您如何在 MyEclipse 中使用 Hibernate,並详细介绍了创建数据库、配置数据库连接、初始化 Hibernate 开发环境、生成 POJO 及 hbm 映射文件等步骤。 创建数据库 在 MyEclipse 中,我们可以使用 SQL ...
在环境搭建过程中,我们需要准备以下组件: 1. **JDK**:Java Development Kit是开发Java应用程序的基础,确保安装的是对应版本的JDK。 2. **Maven/Gradle**:项目构建工具,用于管理依赖库。这里推荐使用Maven,...
Hibernate 源代码分析 (一):设计属于我的 SessionFactory 和 ConnectionProvider 在这篇文章中,我们将探讨 Hibernate 框架的源代码,了解 SessionFactory 和 ConnectionProvider 的实现机制。首先,我们需要了解 ...
在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅可以帮助开发者更好地运用该工具,还能提升对Java编程和数据库原理的理解。本文将开启一...
总之,Hibernate 5.2.4 的环境搭建和源码分析是提升 Java ORM 技能的重要一步,它可以帮助开发者更加高效地进行数据库操作,减少手动 SQL 编写,从而专注于业务逻辑。通过实践和不断学习,我们可以充分利用 ...
在这个环境中,我们将探讨如何搭建一个基本的Hibernate项目,并了解其核心概念。 ### 1. 搭建环境 #### 1.1 添加依赖 首先,我们需要在项目中引入Hibernate的库。如果你使用的是Maven,可以在`pom.xml`文件中添加...
jar包在dialect目录下: 1. DmDialect-for-hibernate2.0.jar 对应 Jdk1.4及以上, hibernate2.0 环境 2. DmDialect-for-hibernate2.1.jar 对应 Jdk1.4及以上, hibernate2.1 -- 2.X 环境 3. DmDialect-for-hibernate3.0...
1. **JDK**: Hibernate运行在Java平台上,所以你需要安装Java Development Kit(JDK),并确保`JAVA_HOME`环境变量已设置。 2. **Maven或Gradle**: Maven是Java项目管理工具,用于依赖管理和构建。如果你选择Gradle...