标识映射(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) ...
随机推荐
- 图片流Base64编码 转图片
using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Web; ...
- 微信公共服务平台开发(.Net 的实现)13-------网页授权(下 :C#代码的实现 )
接着上次的理论,我们这次来研究用代码实现“网页授权获取用户基本信息”,首先我们需要一个链接指向微信的授权页面,在微信开发平台中已经说了,这个链接必须在微信客户端中打开,那么我们就干脆使用文本消息来完成 ...
- iOS开发——动画编程Swift篇&(三)CATransition动画
CATransition动画 // MARK: - CATransition动画 // /* 动画样式 */ // let kCATransitionFade: NSString! //翻页 // l ...
- iOS开发——数据持久化Swift篇&(一)NSUserDefault
NSUserDefault //******************** 5.1 NSUserDefault和对象归档 func useNSUserDefault() { //通过单利来创建一个NSU ...
- initrd映像文档的作用和制作
1.http://pan.baidu.com/s/1dDrGeKL 2.http://wenku.baidu.com/link?url=qPa_jfkEZCbERnwMYWLwm9EZJ_ebMRJA ...
- ngrok 2016版
1. 先到http://www.ngrok.cc/下载客户端 2.进管理页面 注册登录 3.绑定域名 新增: 复制客户端id 打开该目录 按住shift 右键->在此处打开命令窗口 输入 sta ...
- Sql 使用备份还是使用脚本
对sql使用并不熟悉,但是通过项目接触总结出的经验 什么样的场景下选择使用脚本或者备份: 1:当需要创建相关的库的时候使用脚本 2:当需要还原至某个时间点的状态的或者前进至某个版本的数据库的时候就使用 ...
- android中的一些问题
1. Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚 ...
- git 删除已经 add 的文件
使用 git rm 命令即可,有两种选择, 一种是 git rm --cached "文件路径",不删除物理文件,仅将该文件从缓存中删除: 一种是 git rm --f " ...
- python编写telnet登陆出现TypeError:'str' does not support the buffer interface
python3支持byte类型,python2不支持.在python3中,telnet客户端向远程服务器发送的str要转化成byte,从服务器传过来的byte要转换成str,但是在python2不清楚 ...