首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

[php]标记投射和工作单元

2013-10-24 
[php]标记映射和工作单元标记映射系统中可能存在两个相同,但又不是同一个引用的对象,这样的重复对象可能是

[php]标记映射和工作单元
    标记映射

        系统中可能存在两个值相同,但又不是同一个引用的对象,这样的重复对象可能是从数据库中读出来的,这样就造成了不必要的查询。

        标记映射是一个类ObjectWatcher,它负责管理进程中的领域对象,以保证进程中不出现重复对象。

        标记映射可以防止重新读取数据库查询数据,只有当ObjectWatcher类中不存在标记映射对应的对象时才去查询数据库。这样就保证了在一个进程中,一条数据只对应一个对象。

        代码很容易懂,都是一些存取数组值的操作。

        ObjectWatcher代码:


        现在,当Mapper从数据库中取出的数据映射成的对象都被标记到ObjectWatcher了,而且不需要对对象手动操作标记到ObjectWatcher,Mapper就已经帮你完成了。这样带来的好处是可以减少对数据库的操作和新对象的创建,比如find、createObject。但这也许可能带来问题,如果你的程序需要并发处理数据,那么被标记的对象数据就可能不一致了,你在这个时候可能需要对数据加锁。  


    工作单元

          有些时候,我们可能没有改变数据的任何值却向数据库多次保存该数据,这当然是不必要的吧。工作单元可以使你只保存那些需要的对象。工作单元可以在一次请求即将结束时,把在这次请求中发生变化的对象保存到数据库中。一次请求的最后是在控制器(Controller)调用完Command和View之后,那么我们就可以在这里让工作单元执行任务。  

        标记映射的作用是在处理过程开始时向数据库加载不必要的对象,而工作单元则是在处理过程之后防止不必要的对象保存到数据库中。这两个工作方式就像是互补的。

        为了判断哪些数据库的操作是必要的,那就需要跟踪与对象相关的各种事件(比如:setter()重新设置了对象的属性值)。跟踪工作当然最好放在被跟踪的对象中。

        修改过的ObjectWatcher类:


         修改过的Mapper(和上面相同部分略去了,太占位子了):

insert :demo\domain\Classroom_四年(3)班_58update :demo\domain\Classroom_五年(2)班_1
        

        现在对领域对象的管理有了较大的改进了。还有,我们使用模式的目的是提高效率,而不是降低效率。
        


热点排行