标识映射(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) ...
随机推荐
- NGUI ERROR:UnityException: Sprite is not rectangle-packed. TextureRect is invalid.解决
在使用Ngui 3.4.9的时候,使用“Unity 2D Sprite”控件的时候,出现了UnityException: Sprite is not rectangle-packed. Texture ...
- 字符集乱码问题:ISO-8859-1和GBK
问题,引用百度知道的问题吧: http://zhidao.baidu.com/question/51342167.html?qbl=relate_question_0&word=%C3%84% ...
- WCF入门教程(二)从零做起
通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) 定义了协议,具体什么操作,操作的参数和返回值 ...
- java Servlet接口及应用
基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理 ...
- IIS问题汇总
1.问题描述 VS和Framework的安装顺序不对导致网站打不开 原因分析 Framework出现问题 解决办法 重新注册Framework版本 a.开始->运行-&g ...
- 第1章 游戏之乐——让CPU占用率曲线听你指挥
让CPU占用率曲线听你指挥 写一个程序,让用于来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况: CPU的占用率固定 ...
- JS获取与遍历节点的兄弟父级
发布:脚本学堂/JavaScript 编辑:JB01 2014-01-23 15:40:11 [大 中 小] 介绍下js获取节点的兄弟.父级与子元素的方法,学习下js遍历节点的操作方法,有需要 ...
- DOS命令如何进入指定的下一级目录?
如cd E:\java workspace\test\src 如何进入E盘 ,直接 E:
- Java中Integer的最大值和最小值
从JDK1.0开始,Integer中就定义了MIN_VALUE和MAX-VALUE两个常量: /** * A constant holding the minimum value an {@code ...
- mac jdk设置
mac系统一般默认会安装jdk 1.6,路径为/System/Library/Java/JavaVirtualMachines/1.6.0.jdk,此Jdk为系统默认jdk; 但某些框架/应用要求jd ...