工作单元(unit of work)
维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决。
从数据库中存取数据时,记录所修改的内容是非常重要的,否则,哪些改变的数据将不会被写回到数据库中,同样,必须插入创建的新对象和移除已删除的对象。
如果每次修改对象都对数据库进行操作,那是不靠谱的。
工作单元记录在业务事务过程中对数据库有影响的所有变化,操作结束后,作为一种结果,工作单元了解所有需要对数据库做的改变。
运行机制
工作单元记录整个修改过程,关键在提交的时候,它打开一个事务,做所有的并发检查并向数据库写入所做的修改。
- 调用者注册,用户改变了对象就必须将它注册到工作单元。
- 对象注册,把注册方法置于对象方法中,
- 工作单元控制器,工作单元控制所有的数据库读操作,读取之后,拷贝一个对象,提交时进行比较
使用时机
工作单元解决的基本问题是记录操作过的各种对象,以便知道为了使内存中的数据与数据库同步时需要考虑哪些对象。除工作单元以外,还可以采用显式的调用方式,目前我们都这样干的。
标识映射
通过在映射中保存每个已经加载的对象,确保每个对象只加载一次,当要访问对象的时候,通过映射来查找他们
标识映射记录在一个业务事务中从数据库读出的所有对象,无论什么时候要用一个对象,先检查标识映射,看是否已经存在其中。
目前使用最多的就是缓存机制,加载之后放于map中,下次先找map,没有再去数据库查找。
延迟加载
一个对象,它虽然不包含所需要的所有数据,但是知道怎么获取这些数据。
延迟加载主要用于,加载对象时有许多关联对象,这些对象在不需要时是不需要加载的。
运行机制
有四种实现延迟加载的方法
- 延迟初始化(lazy initialization),每次访问属性域都要检查该域是否为空,用null来标记一个没有加载的域。适用于活动记录、表数据入口和行数据入口。
- 虚代理(virtual proxy),它看起来是一个对象,但实际上不包含任何东西,当它有一个方法被调用时,它才用数据库加载恰当的对象。
- 值保持器(value holder),用来包装某个其他对象的对象。只有在第一次访问值保持器时它才从数据库读。
- 重影(ghost) 是部分状态下的真是对象,当从数据库加载对象的时候,它只包含id,要访问其他域的时候,才加载完全。.
使用时机
取决于读取一个对象时需要加载多少数据和数据库调用次数
对象--关系行为模式是对象与数据库之间进行交互的选择,什么时候交互,一次交互多少,如何交互的问题。
转载于:https://my.oschina.net/lohonx/blog/135395