用于维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决。以下:数据库
是提交时,决定要作什么。它打开一个事务,作全部的并发检查(使用悲观离线锁或乐观离线锁)并向数据库写入所作的修改。(开发人员根本不用显示调用数据库更新方法)缓存
调用者注册方式:用户若是改变了某个对象就必须将他注册到工做单元,任何没有注册的对象提交时都不会写入数据库。并发
对象注册方式:注册方法置于对象中,从数据库加载对象会将加载的对象注册为“干净”的,setting方法将要设置的对象注册为“脏”的。性能
工做单元控制器:工做单元控制全部数据库的读操做,一旦对象被读取,将将它注册为“干净”的对象。工做单元在读操做时将产生一个拷贝,在提交时比较当前对象和拷贝对象(这种的办法是指发生改变的对象),看对象是否发生了改变。3d
用途:数据库(使用引用完整性时保证更新顺序、批量更新)、事务资源(调整消息队列、事务监控)代理
.Net环境工做单元实现:使用无链接的数据集,每一行都有版本(当前版本、原始版本、建议版本)、状态(不变、增长、删除、修改)概念cdn
基本目的:记录操做过的各类对象,以便知道为了使内存中数据与数据库同步须要考虑哪些对象。对象
##2. 标识映射 经过在映射中保存每一个已经加载的对象,确保每一个对象只加载一次。当要访问对象时,经过映射来查找它们。blog
键选择:继承
数据表主键(或其余简单的数据类型)
显示的仍是通用的(如findPerson(1),仍是find("Person", 1)?):当全部对象键类型相同时使用通用的,其余状况下使用显示的
数量(单映射、多映射):(没看明白)
标识映射存放位置:有工做单元时,放在工做单元;没有工做单元时,捆绑到会话的注册表
通常来讲,用一个标识映射来管理全部修改了的数据库读出数据;
做为数据库读取操做的告诉缓存。
一个对象,它虽然不包含所须要的全部数据,可是知道怎么获取这些数据
延迟初始化:
实现思想:每次访问属性域都要先检查该域是否为空。若是为空,在返回域值以前计算出这个域的值(注意这个域须要自封装,即使是类的内部也只能经过它来访问)
优缺点:简单,但每每会在对象和数据库间强加依赖关系
适用场景:活动记录、表数据库入口、行数据入口
虚代理:
定义:虚代理是这样一个对象,它看起来应该是域中的一个对象,但实际上它并不包含任何东西。只有当他的一个方法被调用时,它才从数据库加载适当的对象
优缺点:看上去彻底就是须要的对象,但并不真的是那个对象,容易陷入标识问题;同一个实对象,可能有多个不一样对象特征的虚代理(须要覆盖Equals方法,而不用标识方法)
适用场景:数据映射器
值保持器:
实现思想:要想获取某对象,能够访问值保持器获得它的值,但只有第一次访问值保持器时它才真正从数据库读取数据
优缺点:可避免标识问题;类须要知道值保持器的存在,丧失强数据类型显式性;
重影:
实现思想:当从数据库加载对象时,它只包含其ID。当每次要访问某个域时,它就会加载其彻底状态(能够把域数据分为不一样组,按需加载)
延迟加载的问题:
继承(虚代理、重影,须要知道要建立什么类型的重影或虚对象);
波动加载(产生超出须要的数据库访问),影响应用程序性能(解决办法:不适用延迟加载集合中的项,但集合总体能够延迟加载)
适用场景:面向方面的程序(将延迟加载置于一个单独的方面,能独立改变延迟加载策略)
最佳时机:须要额外的调用,而且当使用主对象时所调用的数据没有到的时候(取决于加载一个对象时须要从数据库读取多少数据和数据库调用的次数)