面向服务开发中三层架构中事务单元的生命期管理

    经典的三层分层结构,控制层(Control),服务层(Service),持久层(Repository)应用广泛,在面向服务(SOA)的架构中,配合DI、IOC实现开放灵活的技术架构。

    SOA中,Respository面向数据访问,提供访问数据库、文件、或其他业务接口提供持久能力。Service面向业务,提供访问业务功能的接口,使用领域模型描述业务需求,方便产品人员、需求人员和客户沟通理解业务流程。最后,Control面向业务流程整合,提供基于事务的需求实现。

    事务,用需求来讲,就是事情要么成功,要么就是没有变化,不能有中间的不正常状态。在数据库事务中,数据库产品已经提供了数据库事务,来保证数据修改删除的事务性,电商支付体系中,也提供了预扣费,消费来保证事务性。

    既然事务这么重要,我们应该在哪里控制事务呢?控制层、服务层还是持久层?

    按照分而治之的思路,应该是持久层服务持久层的事务,服务层控制服务的事务,控制层控制这个事务,层层管理,内层事务自治的同时,服从外层事务。互相配合,协同工作完成。

    理想中的无事务控制流程和生命期是这样的,如下图:

    理想中的有事务的流程是这样,简图如下:

但是因为Unity/Spring的系统中,IOC控制着对象的生命周期,图中LifeScope对象对程序员不可见,便会引发集中常见的问题。

1. 完全无视生命期,不进行回收

    这种情况下,程序的反应是Respository每次创建数据库连接,直到数据库连接数过多,造成系统宕机。(几乎没人使用的系统除外)

2. 每次创建生命期,等框架自动回收

    此时分两类,一种对框架比较了解,能正确配置使用并观察到生命期内对象的回收,此时没有问题。第二种就悲催了,认为框架就应该做好了回收,完全自动化回收,此时完全看抄的度娘上人什么水准了,差的情况,一样会数据库连接数过多,造成系统宕机。

3. 单例服务改为每次创建,降低性能

    有时,为了解决单例服务产生的数据库连接问题,连接上已经启动事务等问题,有人把应该为单例的服务配置为每次创建,想依靠服务每次创建,自动创建不懂的数据库连接。姑且不说服务是不是应该单例存在,这样每次创建,就会造成极大的性能开销。

时间: 2024-11-05 19:15:21

面向服务开发中三层架构中事务单元的生命期管理的相关文章

MVC + WCF + 三层架构中model的困惑

最近做一个项目有个地方比较就纠结,项目使用WCF做数据库服务,MVC5架构,三层架构(BLL,Model,DAL也就是调用WCF服务),这三者间传递数据基本是以对象为单位 如果User,但BLL调用WCF中model,和三层架构中model,还有MVC中的model,该怎么分配比较好呢,是mvc中建立model且在三层中建立model,还是三个中都只建立一个model.但mvc中显示的model不一定是bll中的model,可能只是其中的几个字段.如果分别都建立一个model,那我从BLL中传递

asp.net中三层架构与mvc之区别?

对于标题中的问题,如果是没有同时接触三层架构和mvc的初级.net开发人员,想必一定会非常糊涂和混淆.关于此我也百度过N回,看过N多帖子和 回答,但几乎没有人能表述清楚.近期我从典型mvc+entityframework开发模式转型为三层架构的webform模式,才真正了解了二者的概 念. 一言以概之,采用mvc的同时,也可以采用三层架构,这二者没有直接关系. 三层架构中有一层UI层,或叫web层,我们所做的mvc项目都是依托于三层架构中的UI层而言的.mvc的概念主要是相对于webform中视

单例模式的几种实现--《java开发技术-在架构中体验设计模式和算法之美》

package com.doctor.java.design_pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /**  * 单例模式的几种实现--<java开发技术-在架构中体验设计模式和算法之美>  *   * @author doctor  *  * @time 2015年4月24日 下午11:11:03  */ public class SingletonPattern { /**  * @param a

事务管理在三层架构中应用以及使用ThreadLocal再次重构

本篇将详细讲解如何正确地在实际开发中编写事务处理操作,以及在事务处理的过程中使用ThreadLocal的方法. 在前面两篇博客中已经详细地介绍和学习了DbUtils这个Apache的工具类,那么在本篇中将全部使用DbUtils来编写我们的代码,简化操作嘛,由于本篇主要讲解事务,因此如果不懂事务,可以先看之前的博客<使用JDBC进行数据库的事务操作(1)>和<使用JDBC进行数据库的事务操作(2)>. 在博客<使用JDBC进行数据库的事务操作(2)>中我们已经学习了使用J

C#中三层架构UI、BLL、DAL、Model实际操作

三层架构分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL)再加上实体类库(Model) 转载请注明出自朱朱家园http://blog.csdn.net/zhgl7688 1.实体类库(Model),主要存放数据库中的表字段. 操作: (1)先建立实体类库Model,打开项目,在解决方案中右键-->添加-->新建项目-->选中类库-->改名Model-->确定 (2)选中Model类库-->Shift+ALT+C-->建立实体类.UserInfo类 n

【原创设计分享】面向服务的分布式日志架构

概述 对于日志的记录,无论是Log4Net也好,NLog日志也罢,提供的功能都比较全面,并且久经历史考验,但是基于服务的日志架构并不采用他们其中的任何一个框架来实现,即使他们可以处理的更好,该架构主要用来处理对于多台服务器,并且每台服务器下的有许多不同的站点,集中对日志进行处理,包含需要记录的审计日志和系统日志,统一交由一个服务来实现对日志的存储.并且可通过相应的工具进行查看日志的实时监控情况. 整体设计图 设计思想 根据整体设计图不难看出对于实现很简单. 首先,写一个WCF服务,里面提供接口并

《修炼Java开发技术 在架构中体验设计模式和算法之美》 - 书摘精要

(P7) 建议直接加入到软件公司中去,这样会学到很多实际的东西: 程序员最主要的发展方向是资深技术专家,无论是 Java..Net 还是数据库领域,都要首先成为专家,然后才可能继续发展为架构师: 增强工作的主动性和参与性: 只有拥有更高的眼界,才能谋取更大的发展: (P10) 跳槽是需要本钱的,这个本钱就是你积累的工作经验.工作业绩.技术水平和工作能力: (P11) 一个好的领域专家一定是业务领域的架构师,他能够给出某一个业务领域的架构,我们可以称为业务架构,只有技术架构和业务架构紧密结合,才有

架构中的设计原则之接口分离原则(ISP) - 《java开发技术-在架构中体验设计模式和算法之美》

接口分离原则 接口分离原则的核心思想是:不应该强迫客户程序依赖它们不需要使用的方法.英文缩写ISP,即Interface Segregation Principle.其实接口分离原则的意思就是:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该 把所有的操作都封装到一个接口中. 这里的"接口"指的不仅仅是通过interface关键字定义的接口,接口分为如下两种. 对象接口.java中声明的一个类,通过new关键字产生的一个实例,它是对一个类型的事物的描述,这也是一种

怎么在三层架构中使用Quartz.Net开源项目(与数据库交互)

1.首先在项目中先创建一个控制台应用程序 2.然后右击项目中的[引用],可以[添加引用],也可以[管理NuGet程序包],作者使用的是[添加引用],添加本地应用.版本不同,所使用的方式不同.需要此版本的可联系作者. 3.在Main函数中添加以下代码:(注意引用命名空间) IScheduler sched; ISchedulerFactory sf = new StdSchedulerFactory(); sched = sf.GetScheduler(); JobDetail job = new