标识映射(Identify Map)
- 通过在Map中保存每个已加载过的对象,确保每个对象只加载一次.
- 当要访问对象时,首先检查标识映射,看需要的对象是否已经存在其中.
- 使用Identify来确保不重复加载相同的数据,不仅有助于保证正确性(不会将同一数据加载到两个不同的对象上),还能提升性能.

- 运行机制
- 基本思想:使用一系列映射.这些映射包含了从DB读出的对象.
- 键选择
- 当DB的键只有一列,且不可改变时,最自然的就是DB的主键.
- 通常,一个以简单数据类型的代理主键,可以作为映射的键.
- 显示还是通用.
- 显式的.为每一种需要的对象提供不同的方法.findPerson(1).
- 推荐.
- 强类型有利于编译时检查.
- 显示的接口.
- 但是每增加一个映射就要加入一个方法.
- 通用的.为所有的对象提供统一的方法.find("person",1).
- 易于构造可重复使用的注册表.
- 新增映射时不需要修改它.
- 键的类型也会影响它.如果对象的键类型相同,那么通用型很合适.
- 显式的.为每一种需要的对象提供不同的方法.findPerson(1).
- 数量
- 范围:从一个类对应一个映射,到整个会话对应一个映射.
- 对于多映射,一般是每个类或者每个表对应一个映射.
- 当DB方案和对象模型同构时,没有问题.
- 当不同时,基于对象比较容易.因为对象不知道映射的复杂关系.
- 对于继承.多个映射分离使得引入多态变得困难.最好一个继承树一个映射.
- 但是必须保证键在继承树中的唯一性.
- 单映射的优点是新增DB表时,不必增加新的映射.
- 放在那里
- 要确保每个会话都有自己的实例,并独立于其他会话的实例.
- 当正在使用工作单元时,最好放在工作单元上.
- 如果没有,捆绑到会话的注册表中.
- 事务相关
- 通常一个会话子还有一个单一标识映射.否则,就要为映射提供事务保护.
- 两个例外
- 用对象数据库作为事务高速缓存.
- 在所有条件下都是只读的对象.不必担心这些对象在会话期间的共享问题.
- 把只读标识映射放在进程上下文中,把可更新的标识映射放在会话上下文中.
- 使用时机
- 用一个标识映射来管理所有修改了的数据库读出对象.
- 主要是不希望出现两个内存对象对应同一条数据库记录的情形.
- 可作为数据库读取操作的高速缓存.
- 不需要每次访问某数据都去访问DB.
- 由于不必担心对不变对象的修改异常,所以其用不着标识映射.
- 标识印刷有助于避免同一会话中的更新冲突.但它对超出会话的冲突根本无用.
- 用一个标识映射来管理所有修改了的数据库读出对象.
标识映射(Identify Map)的更多相关文章
- 数据访问模式:Identity Map(标识映射)模式
1.Identity Map模式简介 Identity Map(标识映射)模式是通过将所有已加载对象放在一个映射中确保所有对象只被加载一次,并且在引用这些对象时使用该映射来查找对象.在处理数据并发访问 ...
- 标识域 Identify Field
在对象中保存DB的ID字段,以维持内存对象和DB数据Row之间的identify. 关系DB使用key来区分数据行. 而内存对象不需要这样的键.因为对象系统能够保证身份确认. 读取时没有问题,但是为了 ...
- GO语言总结(4)——映射(Map)
上一篇博客介绍了Go语言的数组和切片——GO语言总结(3)——数组和切片,本篇博客介绍Go语言的映射(Map) 映射是一种内置的数据结构,用来保存键值对的无序集合. (1)映射的创建 make ( m ...
- 源映射(Source Map)详解
一.什么是源映射 为了提高性能,很多站点都会先压缩 JavaScript 代码然后上线, 但如果代码运行时出现错误,浏览器只会显示在已压缩的代码中的位置,很难确定真正的源码错误位置. 这时源映射就登场 ...
- 查询(Query)和标识(Identify)
查询(Query)和标识(Identify) 相关文章:RESTful API URI 设计的一些总结. 问题场景:删除一个资源(Resources),URI 该如何设计? 应用示例:删除名称为 iP ...
- 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的map文件. 第四节课里,痞子衡给大家介绍了第一种output文件-relocatable文件,本文继续给大家讲projec ...
- 列表生成式+过滤器(filter)+映射(map)+lambda总结
这些都是python的特色,不仅强大,而且好用,配合起来使用更是无敌. 零.lambda lambda用于产生一个匿名表达式,组成部分为:lambda + ‘函数表达式’ ‘函数表达式’由一个冒号加上 ...
- Golang实现mysql读库映射成Map【Easy】
这个类库灵感来源于.net的dbHelper类,因为其简单易用,现在go的driver必须使用对象映射,这让人火大不爽,不能实现灵活的Map,在Key经常变动的业务场景里面非常不爽,我还是喜欢直接写s ...
- 第二十七篇 玩转数据结构——集合(Set)与映射(Map)
1.. 集合的应用 集合可以用来去重 集合可以用于进行客户的统计 集合可以用于文本词汇量的统计 2.. 集合的实现 定义集合的接口 Set<E> ·void add(E) ...
随机推荐
- Oracle DB 管理数据库的空间
• 描述4 KB 扇区磁盘的概念及使用 • 使用可移动表空间 • 描述可移动表空间的概念 数据库存储 数据库存储 数据库包括物理结构和逻辑结构.由于物理结构和逻辑结构是分开的,因此管理数据的物 理存储 ...
- XCode7,打包上传的一些警告,及参考处理方法
1.ERROR ITMS-90046 /90085: "Invalid Code Signing Entitlements. Your application bundle's signat ...
- MySQL执行SHOW STATUS查询服务器状态状态之Handler_read_* 详解
在MySQL里,我们一般使用SHOW STATUS查询服务器状态,语法一般来说如下: SHOW [GLOBAL | SESSION] STATUS [LIKE ‘pattern’ | WHERE ex ...
- DNS服务器全面解析--转
引用地址:http://pangge.blog.51cto.com/6013757/1273087 基础认知篇 DNS服务的概述 DNS是Domain Name System 的缩写,即域名系统.DN ...
- Jquery zTree结合Asp.net实现异步加载数据
zTree结合Asp.net实现异步加载数据 实现简单操作 zTree 下载 api 访问 :http://www.ztree.me/v3/main.php 例子中用到json数据转化 newtons ...
- UIView的生命周期
一. 大体流程: (loadView/nib)文件来加载view到内存-->viewDidLoad函数进一步初始化这些view-->内存不足时, 调用viewDidUnload函数释放vi ...
- L - Abbott's Revenge(比较复杂的bfs)
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Practice UV ...
- MVC框架 - 异常处理
在ASP.NET中,错误处理是通过使用标准的尝试捕捉方法或使用应用程序事件.ASP.NET MVC附带内置支持,被称为异常过滤器功能异常处理.在这里我们要学习两种方法:一个是定义HandleError ...
- Ngnix 安装、信号量、虚拟主机配置
ngnix的安装很简单 1.先从ngnix官网下载ngnix压缩包 wget http://nginx.org/download/nginx-1.6.2.tar.gz 2.解压并进入其目录 tar - ...
- VMware系统运维(十五)部署虚拟化桌面Horizon View Manager 5.2添加vCenter Server服务器
1.点击"添加...",进入到"添加vCenter Server"界面,输入服务器的IP地址,用户名密码,点击"下一步" 2.设置View ...