知识卡片

标识映射该放在哪里:工作单元优先,只读对象例外

普通读书笔记卡

内容

标识映射必须放在容易找到、且每个会话都有独立实例(不与其他会话共享)的地方。如果系统已经用了工作单元,工作单元是放置标识映射最理想的位置——因为工作单元本身就负责记录进出数据库的数据,把标识映射放进去顺理成章;如果没用工作单元,次优选择是绑定到会话对应的某个注册表上。默认前提是”一次会话对应一个标识映射”,否则要给映射本身加事务保护,这件事即使是老练的开发者也会觉得棘手。但有两个例外场景值得放宽这个默认前提:一是把对象数据库当成关系数据库之上的事务级缓存来用(虽然作者没见过针对这点的专门性能研究,但不少他尊敬的人对此很推崇);二是那些在所有条件下都只读、绝不会被修改的对象——既然它们永远不会变,就不必担心跨会话共享带来的一致性问题,性能敏感的系统里,一次性加载全部只读数据并让它在整个处理过程里全程可用反而更划算,甚至清除掉整个进程范围内的这份只读映射也无所谓(下次用到时自动从服务器重取即可)。基于这个洞察,即便偏好使用单一标识映射,也完全可以在其内部按”只读”和”可更新”拆成两部分分别处理,再对外提供一个统一接口把这个内部划分屏蔽掉,用户不必知道底层其实是两套映射。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第11章 对象-关系行为模式"之"11.2.1 运行机制"(源文件:_epub-src/OEBPS/Text/000095.html) - 结论依据:原文说明"如果正在使用工作单元,则把标识映射放到工作单元中。到目前为止,工作单元是放置标识映射最理想的地方……另外一个例外是在所有条件下都为只读的对象。如果一个对象从来就不会被修改,就不必担心它在会话期间的共享问题……把只读标识映射放在进程上下文中,把可更新的标识映射放在会话上下文中",直接支撑本卡结论。 - 原始内容:即使你更喜欢只用一个标识映射,也可以根据只读和可更新把标识映射分为两部分。通过提供一个检查这两部分映射的统一接口就可以使用户不必知道这种划分。