一、概念
identity Map:通过在映射中保存每个已经加载的对象,确保每个对象只加载一次,当要访问对象的时候,通过映射来查找它们。其实在数据源架构模式之数据映射器代码中有提及到标识映射,Mapper类的getFromMap方法就是实现标识映射的实现。
二、为什么要使用标识映射?
//client代码 $venue = new venue(); $venue->setName("XXXXXXX"); //插入一条数据 $mapper = new VenueMapper(); $mapper->insert($venue); //获取刚插入的数据 $venueInfo = $mapper->find($venue->getId()); //修改数据 $venue->setName('OOOOOOOOOOO'); $mapper->update($venue);
$venue对象和$venueInfo对象是完全等同的,只是变量不同,在同一请求中,可能多次使用同一个对象。如果你修改了该对象的某个版本并保存到数据库中,如果确保该对象的另一个版本不会被你的修改所覆盖?不仅如此,重复的对象还可能导致系统性能降低。在一个进程中,一些常用的对象可能会被调用三四次,没必要每次都把对象重新保存到数据库中。标识映射可以很容易地解决这些问题。
三、实现标识映射
一个标识映射只是一个对象,它的任务就是跟踪系统中所有对象,并帮助系统避免将一个对象看成两个对象。
class ObjectWatcher { private $all = array(); private static $instance; private function __construct() { } static function instance() { if ( ! self::$instance ) { self::$instance = new ObjectWatcher(); } return self::$instance; } function globalKey( DomainObject $obj ) { $key = get_class( $obj ).".".$obj->getId(); return $key; } static function add( DomainObject $obj ) { $inst = self::instance(); $inst->all[$inst->globalKey( $obj )] = $obj; } static function exists( $classname, $id ) { $inst = self::instance(); $key = "$classname.$id"; if ( isset( $inst->all[$key] ) ) { return $inst->all[$key]; } return null; } }
在数据源架构模式之数据映射器中利用此映射
private function getFromMap( $id ) { return ObjectWatcher::exists( $this->targetClass(), $id ); }
说到这感觉是不是有点像注册表?
四、小结
如果在创建对象或添加对象到数据库时使用标识映射,系统中对象出现重复的可能性就变成了0.
当然,这只能对当前进程有效。不同进程间不可避免地会在同一时间访问同一个对象的不同版本。有时要考虑到并发访问可能会引起冲突导致数据损坏。如果问题严重,可能需要采用一定的“锁定”策略。也可以考虑将对象保存到共享内存中或者使用一个外部对象缓存系统,如memcached。
相关推荐
对单个对象的重要行为进行建模:状态图 96 第九章 GRASP: 职责分配模式 97 导言 97 职责和方法 98 UML类图表示方法 98 职责和交互图 98 模式 99 GRASP: 职责分配中通用原则的模式 99 专家 99 问题: 99 解决方案: ...
5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...
6.4.1 对象/关系映射器 6.4.2 使用O/RM工具创建数据访问层 6.5 是否应该使用存储过程 6.5.1 有关存储过程的传言 6.5.2 那么动态SQL呢 6.6 小结 6.7 本章的墨菲法则 第7章 表现层 7.1 用户界面和表现...
6.4.1 对象/关系映射器 6.4.2 使用O/RM工具创建数据访问层 6.5 是否应该使用存储过程 6.5.1 有关存储过程的传言 6.5.2 那么动态SQL呢 6.6 小结 6.7 本章的墨菲法则 第7章 表现层 7.1 用户...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...
5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...
5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. EntityResolver 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高...
5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高/低位算法(Hi/Lo ...
5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...
5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...
5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...
5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. EntityResolver 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高...
而软件开发过程是一种高密集度的脑力劳动,软件开发的模式及技术 不能适应软件发展的需要。致使大量质量低劣的软件涌向市场,有的花费大量人力、财力, 而在开发过程中就夭折。软件危机主要表现在两个方面: (1) ...
5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. XML名称空间 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. (主键生成策略)generator 5.1.4.2. 高/...
由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此,为了表示存放在计算机存储空间中的各数据元素之间的逻辑关系(即前后件关系),在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各...
5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. XML名称空间 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. (主键生成策略)generator 5.1.4.2. 高/...
空间数据引擎和对象关系空间数据库的对比 项目 空间数据引擎(寄生模式) 对象关系空间数据库(融合模式) 技术特点 中间件技术 数据库技术 代表产品 ARCSDE、SuperMap SDX+、MapGIS SDE、TerraLib(开源) Oracle ...
2.3.4 对象-对象映射 2.3.5 依赖注入 2.4 研究和开发 2.4.1 自动化测试生成工具 2.4.2 契约式编码 2.5 微软安全开发生命周期 2.6 小结 第3章 实现预期目标 3.1 成功要素 3.1.1 项目启动阶段 3.1.2 超出范围 3.1.3 ...