• 通过在Map中保存每个已加载过的对象,确保每个对象只加载一次.

    • 当要访问对象时,首先检查标识映射,看需要的对象是否已经存在其中.
    • 使用Identify来确保不重复加载相同的数据,不仅有助于保证正确性(不会将同一数据加载到两个不同的对象上),还能提升性能.
  • 运行机制
    • 基本思想:使用一系列映射.这些映射包含了从DB读出的对象.
    • 键选择
      • 当DB的键只有一列,且不可改变时,最自然的就是DB的主键.
      • 通常,一个以简单数据类型的代理主键,可以作为映射的键.
    • 显示还是通用.
      • 显式的.为每一种需要的对象提供不同的方法.findPerson(1).

        • 推荐.
        • 强类型有利于编译时检查.
        • 显示的接口.
        • 但是每增加一个映射就要加入一个方法.
      • 通用的.为所有的对象提供统一的方法.find("person",1).
        • 易于构造可重复使用的注册表.
        • 新增映射时不需要修改它.
      • 键的类型也会影响它.如果对象的键类型相同,那么通用型很合适.
    • 数量
      • 范围:从一个类对应一个映射,到整个会话对应一个映射.
      • 对于多映射,一般是每个类或者每个表对应一个映射.
        • 当DB方案和对象模型同构时,没有问题.
        • 当不同时,基于对象比较容易.因为对象不知道映射的复杂关系.
      • 对于继承.多个映射分离使得引入多态变得困难.最好一个继承树一个映射.
        • 但是必须保证键在继承树中的唯一性.
      • 单映射的优点是新增DB表时,不必增加新的映射.
    • 放在那里
      • 要确保每个会话都有自己的实例,并独立于其他会话的实例.
      • 当正在使用工作单元时,最好放在工作单元上.
      • 如果没有,捆绑到会话的注册表中.
    • 事务相关
      • 通常一个会话子还有一个单一标识映射.否则,就要为映射提供事务保护.
      • 两个例外
        • 用对象数据库作为事务高速缓存.
        • 在所有条件下都是只读的对象.不必担心这些对象在会话期间的共享问题.
          • 把只读标识映射放在进程上下文中,把可更新的标识映射放在会话上下文中.
  • 使用时机
    • 用一个标识映射来管理所有修改了的数据库读出对象.

      • 主要是不希望出现两个内存对象对应同一条数据库记录的情形.
    • 可作为数据库读取操作的高速缓存.
      • 不需要每次访问某数据都去访问DB.
    • 由于不必担心对不变对象的修改异常,所以其用不着标识映射.
    • 标识印刷有助于避免同一会话中的更新冲突.但它对超出会话的冲突根本无用.

标识映射(Identify Map)的更多相关文章

  1. 数据访问模式:Identity Map(标识映射)模式

    1.Identity Map模式简介 Identity Map(标识映射)模式是通过将所有已加载对象放在一个映射中确保所有对象只被加载一次,并且在引用这些对象时使用该映射来查找对象.在处理数据并发访问 ...

  2. 标识域 Identify Field

    在对象中保存DB的ID字段,以维持内存对象和DB数据Row之间的identify. 关系DB使用key来区分数据行. 而内存对象不需要这样的键.因为对象系统能够保证身份确认. 读取时没有问题,但是为了 ...

  3. GO语言总结(4)——映射(Map)

    上一篇博客介绍了Go语言的数组和切片——GO语言总结(3)——数组和切片,本篇博客介绍Go语言的映射(Map) 映射是一种内置的数据结构,用来保存键值对的无序集合. (1)映射的创建 make ( m ...

  4. 源映射(Source Map)详解

    一.什么是源映射 为了提高性能,很多站点都会先压缩 JavaScript 代码然后上线, 但如果代码运行时出现错误,浏览器只会显示在已压缩的代码中的位置,很难确定真正的源码错误位置. 这时源映射就登场 ...

  5. 查询(Query)和标识(Identify)

    查询(Query)和标识(Identify) 相关文章:RESTful API URI 设计的一些总结. 问题场景:删除一个资源(Resources),URI 该如何设计? 应用示例:删除名称为 iP ...

  6. 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的map文件. 第四节课里,痞子衡给大家介绍了第一种output文件-relocatable文件,本文继续给大家讲projec ...

  7. 列表生成式+过滤器(filter)+映射(map)+lambda总结

    这些都是python的特色,不仅强大,而且好用,配合起来使用更是无敌. 零.lambda lambda用于产生一个匿名表达式,组成部分为:lambda + ‘函数表达式’ ‘函数表达式’由一个冒号加上 ...

  8. Golang实现mysql读库映射成Map【Easy】

    这个类库灵感来源于.net的dbHelper类,因为其简单易用,现在go的driver必须使用对象映射,这让人火大不爽,不能实现灵活的Map,在Key经常变动的业务场景里面非常不爽,我还是喜欢直接写s ...

  9. 第二十七篇 玩转数据结构——集合(Set)与映射(Map)

          1.. 集合的应用 集合可以用来去重 集合可以用于进行客户的统计 集合可以用于文本词汇量的统计   2.. 集合的实现 定义集合的接口 Set<E> ·void add(E) ...

随机推荐

  1. 保持长宽比 对背景图像进行修改android:scaleType="fitXY"

    关于android中ImageView的外观,即图片在其内显示出的样子,与布局文件中adjustViewBonds和scaleType属性的关系.我进行了一些探索.现跟大家共享,欢迎各位指教.分别将a ...

  2. linux上nagios安装完整版

    监控server端的安装部署一.apache的安装下载httpd-2.2.15.tar.gz gunzip httpd-2.2.15.tar.gztar xvf httpd-2.2.15.tarcd ...

  3. 强大的ASP.NET控件---验证控件

        学习完了牛腩之后,在进行ASP.NET的学习的时候,对全部学的知识.都有一种似曾相识的感觉,"哦,这个,在牛腩新闻公布系统中用过".仅仅只是那时候.用的也是迷迷糊糊的,就说 ...

  4. sublime添加ctags实现代码跳转

    本次操作是在sublime text 2下进行. 1.先到http://sublime.wbond.net/Package%20Control.sublime-package下载Package Con ...

  5. 高效编程之cache命中对于程序性能的影响

    下面这个代码用两个双层循环遍历了一个二维数组里所有的元素,以我自己机器的测试 上面那个循环耗时基本为下面的一半,两个循环的时间复杂度相同,为什么会有这么大的差别? 首先要明白的是不管是几维数组,他们都 ...

  6. mysql管理员操作

    mysql查帮助手册的技巧:help 你的命令:比如 help create; >>显示mysql中用户:select host,user from mysql.user; >> ...

  7. C# 数据的加密解密

    /// <summary> /// 加密数据 /// </summary> /// <param name="Text"></param& ...

  8. java邮件发送 qq与163邮箱互发和qq和163邮箱发送其他邮箱实例

    研究了近一天的时间,通过查阅相关资料,终于对java发送邮件的机制,原理有了一点点的理解,希望能够帮到大家! 1.首先要向你的项目里导入1个jar包:mail-1.4.4.jar即可(实现qq和163 ...

  9. 沈逸老师PHP魔鬼特训笔记(4)

    上一课我们通过shell脚本拷贝代码,了解了静态方法和静态属性.(还有个附件PHAR包,我直接无视了) 然后在GOD文件中写了一些参数, 我们也可以这样,把方法名像拼凑字符串一样拼起来. $get_p ...

  10. 【Open Search产品评测】- 来往,7天轻松定制属于自己的搜索引擎

    [Open Search产品评测]--   来往,7天轻松定制属于自己的搜索引擎   [使用背景] 相信很多人都遇到过要给网站或者app做一个搜索功能的需求,很久之前自己折腾过lucene,搞了很久, ...