当前位置: 首页 > 后端技术 > PHP

第11天-《企业应用架构模式》-对象-关系行为模式

时间:2023-03-29 21:41:15 PHP

1.工作单元用于维护受业务事务影响的对象列表,并协调变更的写入和并发问题的解决。如下:1)运行机制:key:提交时,决定做什么。它打开一个事务,进行所有并发检查(使用悲观或乐观离线锁)并将更改写入数据库。(开发者根本不需要调用数据库更新方法。)记录对象更新的方法:调用者注册方法:如果用户改变了一个对象,他必须在工作单元中注册它,任何未注册的对象都不会被注册。提交数据库时写入。       对象注册方法:注册方法放在对象中,从数据库加载对象会将加载的对象注册为“干净”,设置方法会将要设置的对象注册为“脏”。        工作单元控制器:工作单元控制所有的数据库读取操作,一旦读取了一个对象,它就将其注册为“干净”的对象。工作单元在读操作的时候会生成一个副本,提交的时候会比较当前对象和复制的对象(这个方法指的是变化的对象),看对象是否发生了变化。        用途:数据库(保证更新顺序,使用引用完整性时批量更新),事务资源(调整消息队列,事务监控)。Net环境工作单元实现:使用无连接数据集,每一行有一个版本(当前版本,原始版本,建议版本),状态(未更改,添加,删除,修改)概念2)何时使用:基本用途:记录各种已经操作过的对象,从而知道需要考虑哪些对象才能将内存中的数据与数据库同步。2.恒等映射通过在映射中保存每个加载的对象来确保每个对象只加载一次。当要访问对象时,通过映射查找它们。  1)运行机制:键选择:数据表(或其他简单数据类型)的主键是否通用显示(如findPerson(1),或find("Person",1)?):当所有对象key类型相同时,使用通用的,其他情况使用显示的数量(单映射,多映射):(没看懂)标识映射的存储位置:当有工作单元,放在工作单元;当没有工作单元时,将其绑定到sessionRegistry2)何时使用:一般来说,使用一个标识映射来管理所有修改的数据库读取数据;作为数据库读取操作的通知缓存。3.延迟加载一个对象,虽然不包含所有需要的数据,但是知道如何获取这些数据1)运行机制:4种实现方式:延迟初始化:实现思路:每次访问属性字段,都必须先检查字段是否为空。如果为空,在返回字段值之前先计算这个字段的值(注意这个字段需要自己封装,即使是类内部也只能通过它访问)优缺点:简单,但经常强加对象与数据库之间的依赖适用场景:ActiveRecord、TableDatabaseEntry、RowDataEntryVirtualProxy:定义:虚拟代理是一个看起来应该是域中的对象,但实际上不包含任何东西的对象。只有当他的方法之一被调用时,它才会从数据库中加载适当的对象。优缺点:看起来和需要的对象一模一样,但实际上不是那个对象,容易陷入识别问题;同一个真实对象可能有多个不同对象特性的虚拟代理(需要重写Equals方法而不是标识方法)适用场景:数据映射器值持有者:实现思路:获取一个对象,可以访问值持有者来获取它的值,但只有在第一次访问值持有者时,它才真正从数据库中读取数据。优缺点:可以避免识别问题;类需要知道值持有者的存在,而失去了强数据类型的明确性;重影:实现思路:当从数据库中读取一个对象时,它只包含它的ID。每次访问域时,都会加载其完整状态(域数据可以分为不同的组,按需加载)延迟加载问题:继承(虚拟代理,重影,需要知道创建什么类型的重影或虚拟对象);波动加载(产生比需要更多的数据库访问),影响应用性能(解决方法:不适用于集合中项的延迟加载,但集合作为一个整体可以延迟加载)适用场景:面向方面的程序(放置延迟加载在一个单独的方面可以独立改变懒加载策略)2)何时使用:最佳时间:需要额外调用,以及使用主对象时调用的数据没有到达的时候(取决于负载需要多少数据)从数据库读取和对象的数据库调用次数)