`

对象关系行为模式之工作单元

阅读更多

一、概念

Unit of Work:维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决。其UML结构大致如下:

工作单元记录在业务事务过程中对数据库有影响的所有变化。操作结束后,作为一种结果,工作单元了解所有需要对数据库做的改变,统一对数据库操作。

 

 

二、为什么要使用工作单元?

如果没有使用工作单元,可以在每次修改对象模型时对数据库对得相应修改,但这样会产生大量规模很小的数据库调用,从而导致速度变慢。而且这样做还需要有一个对整个交互过程都开放的事务,如果存在一个贯穿多个请求的业务事务,这就是不合实际的。如果还要记录读过的对象以避免不致读,那么情况会更糟。

引发处理数据库的原因就是变化:创建新对象和更新或删除已经存在的对象。工作单元就是一个记录这些变化的对象。只要开始做一些可能会对数据库有影响的操作,就创建一个工作单元去记录这些变化。每当创建、改变或者删除一个对象时,就通知此工作单元。也可以让此单元知道所读过的对象,通过验证在整个业务事务处理过程中数据库中的所有对象都没有改变,从而检查一致读。

 

 

三、实现工作单元

对象行为关系模式之标识映射代码中加入

static function addDelete( DomainObject $obj ) {
        $self = self::instance();
        $self->delete[$self->globalKey( $obj )] = $obj;
    }


    static function addDirty( DomainObject $obj ) {
        $inst = self::instance();
        if ( ! in_array( $obj, $inst->new, true ) ) {
            $inst->dirty[$inst->globalKey( $obj )] = $obj;
        }
    }

    static function addNew( DomainObject $obj ) {
        $inst = self::instance();
        // we don't yet have an id
        $inst->new[] = $obj;
    }

    static function addClean(DomainObject $obj ) {
        $self = self::instance();
        unset( $self->delete[$self->globalKey( $obj )] );
        unset( $self->dirty[$self->globalKey( $obj )] );

        $self->new = array_filter( $self->new, 
                function( $a ) use ( $obj ) { return !( $a === $obj ); } 
                );
    }

    function performOperations() {
        foreach ( $this->dirty as $key=>$obj ) {
            $obj->finder()->update( $obj );
        }
        foreach ( $this->new as $key=>$obj ) {
            $obj->finder()->insert( $obj );
        }
        $this->dirty = array();
        $this->new = array();
    } 

ObjectWatcher类仍然是一个标识映射,但增加了跟踪系统中所有对象的功能(通过$all)。

通过addDirty方法,将“脏”(就是被修改了)对象保存在$dirty数组中,直到更新数据库。

通过addClean方法,把“脏”对象标识为“干净”的,这样数据库就不会更新。

通过addNew方法,将新创建的对象添加到$new数组中,该数组中的对象将会被插入到数据库中。

通过performOperations方法,遍历$dirty和$new数组,更新或添加对象。

 

 

四、小结

工作单元解决的基本问题是记录操作过的各种对象,以便知道为了使内存中的数据与数据库同步需要考虑哪些对象。如果能够在一个系统事务中做完所有的工作,则只需要考虑那些改变了的对象。尽管一般来说,工作单元是解决这个问题的最好途径,但还有其他方法。

 

也许最简单的方法是,在修改任何一个对象时就显式地保存该对象,但是带来的问题是可能使用的数据库调用比预想的多。如果操作过程中在三个不同的地方改变了同一个对象,最终会产出三次数据库调用,而不是一次。

 

要避免多重数据库调用,可以把对数据库的更新操作放在最后。为了做到这一点,需要记录已经改变的所有对象。可以在代码中用变量来实现记录跟踪,但是一旦变量很多,变量很快就变得难以管理。一般来说,变量与事务脚本运行得很好,但很难与领域模型一起使用。

 

把每个所改变的对象加上“脏”标志的做法要比把对象保存在变量中好。在事务处理完后,需要找出所有加了“脏”标记的对象并把它们写入到数据库中。这项技术的价值取决于寻找“脏”对象的难易程序。如果所有的“脏”对象都在一个单一层次结构上,就可以遍历该层结构来向数据库写入所有被改变了的对象。然而,跨越一个更一般的对象网络(如一个领域模型)是比较困难的。

 

工作单元的强大功能是把所有的信息保存在一个地方。一旦使用了工作单元,就不必为记录所做的修改做很多操作。而且,工作单元还可以作为更复杂情况下的固定处理平台。

 

 

 


 

2
0
分享到:
评论

相关推荐

    C++设计模式之组合模式(Composite)

    组合模式为了描述分支包含关系,也就是我们说的树形关系,其对象分为枝和叶,每一枝可包含枝和叶,直到全部为叶节点。我们对枝和叶进行行为抽象,可认为枝和叶都是Component,而叶是最小的操作单元,其下不存在枝和...

    基于Geodatabase的地籍数据库系统.doc

    基于这些模型,CA SE工具的代码产生向导帮助建立COM对象,以实现定制对象的行为,建立和管理定制对象 的数据库模式。用ArcCatalog可以建立不同对象类中对象之间的关系(Relationship) ,几何网络中对象的连接规则...

    asp.net知识库

    与DotNet数据对象结合的自定义数据对象设计 (一) 数据对象与DataRow ASP.NET中大结果集的分页[翻译] .net 2.0 访问Oracle --与Sql Server的差异,注意事项,常见异常 Ado.net 与NHibernate的关系? 动态创建数据库...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...

    JavaScript王者归来part.1 总数2

     7.4 对象的销毁和存储单元的回收   7.5 JavaScript的内置对象   7.5.1 Math对象   7.5.2 Date对象--创建一个简单的日历   7.5.3 Error对象   7.5.4 其他内置对象   7.5.5 特殊的对象--全局对象与调用...

    摩托罗拉C++面试题

    可以简单的认为:设计模式就是解决某个特定的面向对象软件问题的特定方法, 并且已经上升到理论程度。 框架与设计模式的区别: 1,设计模式和框架针对的问题域不同.设计模式针对面向对象的问题域;框架针对特定业务的...

    pl/sql developer 9 + 注册机

    此外,该对象浏览器还可以显示对象之间的依存关系,您可以递归的扩展这些依存对象(如包参考检查、浏览参考表格、图表类型等)。 性能优化  使用PL/SQL Profiler,可以浏览每一执行的PL/SQL代码行的时序信息...

    PLSQL Developer 7.1.5

     非PL/SQL对象——不使用任何SQL,您就可以对表格、序列、符号、库、目录、工作、队列、用户和角色进行浏览、创建和修改行为。PL/SQL Developer提供了一个简单易用的窗体,只要将信息输入其中,PL/SQL Developer就...

    PL/SQL Developer

     非PL/SQL对象——不使用任何SQL,您就可以对表格、序列、符号、库、目录、工作、队列、用户和角色进行浏览、创建和修改行为。PL/SQL Developer提供了一个简单易用的窗体,只要将信息输入其中,PL/SQL Developer就...

    PL/SQL Developer v8.0.zip

    非PL/SQL对象——不使用任何SQL,您就可以对表格、序列、符号、库、目录、工作、队列、用户和角色进行浏览、创建和修改行为。PL/SQL Developer提供了一个简单易用的窗体,只要将信息输入其中,PL/SQL Developer就将...

    PLSQL Developer(免安装、汉化版,很好用的) 8.0.3.1510.rar

     非PL/SQL对象——不使用任何SQL,您就可以对表格、序列、符号、库、目录、工作、队列、用户和角色进行浏览、创建和修改行为。PL/SQL Developer提供了一个简单易用的窗体,只要将信息输入其中,PL/SQL Developer就...

    软件工程-理论与实践(许家珆)习题答案

    而软件开发过程是一种高密集度的脑力劳动,软件开发的模式及技术 不能适应软件发展的需要。致使大量质量低劣的软件涌向市场,有的花费大量人力、财力, 而在开发过程中就夭折。软件危机主要表现在两个方面: (1) ...

    PL/SQL Developer 6.05注册版-1

    <br>非PL/SQL对象——不使用任何SQL,您就可以对表格、序列、符号、库、目录、工作、队列、用户和角色进行浏览、创建和修改行为。PL/SQL Developer提供了一个简单易用的窗体,只要将信息输入其中,PL/SQL ...

    PL/SQL Developer 7.1.5 注册版

    <br>非PL/SQL对象——不使用任何SQL,您就可以对表格、序列、符号、库、目录、工作、队列、用户和角色进行浏览、创建和修改行为。PL/SQL Developer提供了一个简单易用的窗体,只要将信息输入其中,PL/SQL ...

    PL/SQL Developer 7.1.5 注册版-3

    <br>非PL/SQL对象——不使用任何SQL,您就可以对表格、序列、符号、库、目录、工作、队列、用户和角色进行浏览、创建和修改行为。PL/SQL Developer提供了一个简单易用的窗体,只要将信息输入其中,PL/SQL ...

    计算机二级C语言考试题预测

    (40) 将E-R图转换到关系模式时,实体与联系都可以表示成(B) A. 属性 B. 关系 C. 键 D. 域 (41) 在下列选项中,哪个不是一个算法一般应该具有的基本特征(C) A. 确定性 B. 可行性 C. 无穷性 D. 拥有足够的情报 (42) ...

    二级C语言公共基础知识

    (26) 实现算法所需的存储单元多少和算法的工作量大小分别称为算法的 ______。 答:空间复杂度和时间复杂度 (27) 数据结构包括数据的逻辑结构、数据的 ______以及对数据的*作运算。 答:存储结构 (28) 一个类可以从...

    计算机二级公共基础知识

    顺序存储方式主要用于线性的数据结构,它把逻辑上相邻的数据元素存储在物理上相邻的存储单元里,结点之间的关系由存储单元的邻接关系来体现。 链式存储结构就是在每个结点中至少包含一个指针域,用指针来体现数据...

    Direct Oracle Access v4.1.3 bcb6

    TOracleEvent工作在您程序的后台线程中,可以向类似对象事件传播数据库事件。这些事件的发生可以同步或异步于您程序的主线程。 SQL脚本 ——如果需要执行多条数据定义语言(DDL)语句,例如运行您程序的数据库安装...

Global site tag (gtag.js) - Google Analytics