标识映射(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) ...
随机推荐
- 如何选择Javascript模板引擎(javascript template engine)?
译者 jjfat 日期:2012-9-17 来源: GBin1.com 随着前端开发的密集度越来越高,Ajax和JSON的使用越来越频繁,大家肯定免不了在前台开发中大量的使用标签,常见到的例子如下: ...
- 使用Underscore.js的template将Backbone.js的js代码和html代码分离
这段时间在学习Require.js和Backbone.js的过程中,发现有些项目里的HTML代码都是写在View的js代码里面的,渲染的时候需要对Collection进行循环,再将HTML代码拼接上去 ...
- TP复习17
三大自动,自动创建,自动验证,自动完成
- select,epoll的比较
机制: select:只支持水平触发(数据不处理完无限通知) epoll:支持水平触发和边缘触发(仅通知一次) 单进程监控FD个数 select: 由FD_SETSIZE设置,默认值是2048.在大量 ...
- linux下的ls命令
在LINUX系统中有一个重要的概念:一切都是文件.其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来.在UNIX系统中,把一切资源都看作是文件,包括硬件设备.U ...
- 迷你MVVM框架 avalonjs 0.81发布
本版本最大的改进是将视图的操作全鄣变成异步.详情如下: 管道符与短路与相混淆的BUG 重构on绑定,省得每次都重复绑定同一个事件回调.虽然addEventListener或attachEvent会忽略 ...
- 终端I/O之终端选项标志
http://www.cnblogs.com/nufangrensheng/p/3575752.html 中的表18-1至表18-4中列出的所有选项标志(除屏蔽标志外)都用一位或几位(设置或清除)表示 ...
- web开发下的各种下载方法
利用TransmitFile方法,解决Response.BinaryWrite下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题. 代码如下: Response.Co ...
- c#winform将全局异常抛出,不用大量写try()catch()
一.在program.cs处完善成如下,但是这样后只能抛出主线程(UI)的错误,所以请看第二步 /// 应用程序的主入口点. /// </summary> [STAThread] stat ...
- Face The Right Way 一道不错的尺取法和标记法题目。 poj 3276
Face The Right Way Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2899 Accepted: 133 ...