zoukankan      html  css  js  c++  java
  • 蛙蛙推荐:简单介绍一下托管容器持久性(CMP),顺便征集一下.NET CMP2.0的改进方案

    CMP(托管容器持久性)的介绍
    传统的数据服务组建中:
    名字:托管组件式持久性方法
    内容: 创建和执行存储过程,
           存储过程缓存,sql语句存储等例程
           连接和过程工厂(procedure factory)
           把创建和执行存储过程进一步抽象
    特点:组件本身要对调用的持久性提供者进行初始化,持久性提供者可以式关系数据库,文件或者其他。重点是,组件必须自己使用持久性提供者,并需要知道如何为数据访问提供参数,例如存储过程参数,数据类型,大小等。这样就会把特定的业务逻辑类和底层的数据访问紧密地联系起来。
            因此,如果要有一个Customer类需要调用SQL存储过程并且运行他来执行某些数据操作(CRUD),那就必须调用SqlCustomer类,因为如果没有使用SQL Server,就必须重写这个类
    新的数据服务组件:
    名字:托管容器式持久性方法(CMP)
    内容:系统中所有数据对象都不考虑自身的数据访问方法。所有的业务对象式纯粹的业务对象,他们维护业务数据并根据业务规则判断这些数据是否正确。业务对象和数据访问层没有丝毫关系。
    特点:容器是一个类,他的任务是得到一个未知数据源的业务对象实例,并且进行数据操作(CRUD)。
    基本流程如下:
    (1)   业务对象被其他某些控件调用,例如被Web页面的后台编码调用
    (2)   业务对象创建一个容器和一个持久对象,也就是一个以托管容器式持久性方式运行的对象
    (3)   然后业务对象调用调用容器上的相关操作方法(CRUD)来执行实际的数据访问。
    核心类:
            CMPConfigurationHandler:负责从Web.config文件中加载元数据配置信息。
    调用CMP数据内核代码:
    SqlPersistenceContainer spc = new SqlPersistenceContainer( CMPConfigurationHandler.ContainerMaps["Categories"] );
    实现CMP的一个标准代码:
    SqlPersistenceContainer spc = new SqlPersistenceContainer( CMPConfigurationHandler.ContainerMaps["Categories"] );
                           CategorySet catSet = new CategorySet();
                           catSet.CategoryId = categoryId;
                           spc.Select( catSet );
                           catSet.FinalizeData();
                          
                           return catSet.ResultSet.Tables[0];
    ,MonitorWervices项目:检测项目,包含了信息跟踪工具和实用程序
    1,     TraceSwitch:追踪开关
    跟踪开关可用于筛选信息。例如,在数据访问模块中,您可能需要查看所有跟踪消息,但在应用程序的其余部分,则只需查看错误信息。这种情况下,可以将一个跟踪开关用于数据访问模块,而将另一个开关用于应用程序的其余部分。通过使用 .config 文件将开关配置为正确的设置,可以控制所接收的跟踪消息类型
    您可以使用 .config 文件来配置开关。对于 Web 应用程序,该文件是与项目相关联的 Web.config 文件。对于 Windows 应用程序,它是命名的(应用程序名称).exe.config。在已部署的应用程序中,该文件必须驻留在与可执行文件相同的文件夹中。
    1.      <system.diagnostics>
    2.         <switches>
    3.            <add name="DataMessagesSwitch" value="0" />
    4.            <add name="TraceLevelSwitch" value="0" />
    5.         </switches>
    6.      </system.diagnostics>
     //把追踪信息记录进标准追踪机制中,Warn方法添加到站点跟踪日值中,红色显示。
    if ( msgLevel == TraceLevel.Error )
                                   httpContext.Trace.Warn( message );
                   else
                   httpContext.Trace.Write( message );
    你是在看《asp.net 电子商务高级编程》吧。例子不错,不过讲的不是很详细。如果你懂java的话,这些问题都不是问题。我不是java!
     
    什么时候用CMP,什么时候用BMP的讨论(JAVA的讨论,不过对你理解CMP有用)

    cmp是容器管理持久性,bmp是bean管理持久性。cmp的持久性(包括生存期,数据库连接等)都是由ejb container(ejb容器)来管理的。bmp则所有的事情都必须由bean来完成,也就是说使用cmp时许多工作都是由服务器(准确的说是ejb容器)来完成的。而bmp则要你来做啦。例如你将一个实体bean连接到一张数据库表上。使用cmp,你只需要建立好cmp与表的映射关系就可以啦。而bmp不仅要建立映射关系,而且数据库连接,断开等等都需要你自己来做。cmp的复杂性要小于bmp,但是灵活性不如bmp,但是我认为一般情况下cmp较bmp用得多,因为简单的多。另外cmp和bmp的外部接口都是一样的,只是内部实现和部署描述不一样,因此如果你把一个cmp改写成一个bmp,或者反之,客户程序是一点也感觉不出来的。EJB2.0由于ejb-ql的加入使得cmp的灵活性大幅度增加,个人感觉对于普通的需求cmp完全可以啦,除非你有特殊要求。比如想在ejb连接数据库的时候,提醒你老婆的生日到啦,该送花啦。
     

    如果想在程序中手动控制事务或想与别的系统如corba集成,就用bmp,一般推荐用cmp,因为ejb2.0对cmp有了全新的定义,新一代的ejbql语言已经成为标准,这种基于对象的类似于sql语句的语言,很可能最后在ejb中取代sql,它支持排序,合计等多种计算。cmp对事务自行控制,字段也自行控制,而且加入了关系的概念,可以使cmp之间支持关系操作,什么简单。但缺点是不太通用,配置麻烦,针对不同的容器要不同的配置,抑止差,不象bmp那样移植好,配置简单,但效率肯定是cmp远远高于bmp
     

    为了增加可移植性就用CMP.....领外CMP也省事,省去你需要了解的好多东西...
     

    你不想使用预设的Insert,Update,Delete之类的代码,而是要使用自己的控制代码,就可以使用BMP,在ejbCreate,ejbStore等方法里面自己撰写代码.
    另外现在EJB2.0中CMP不支持排序若想在SQL语句中排序就要用BMP
     

    最好的解决方案是用CMP,然后用BMP继承CMP。用BMP来做CMP不能做的事,
    比如like查询。
    两者兼顾。
    既可以有CMP的可移植性。又可以有BMP的灵活性。
    不过遵守一个原则,能有CMP的就要用CMP。
    呵呵!
     

    我一般都用CMP,只有在表结构比较复杂、SQL语句复杂的情况下使用BMP。
     

    当你想灵活的使用ejb时,而对可移制性要求不高时,使用bmp。否则使用cmp
     

    CMP周期短,简单,但有依赖性,
     

    CMP比较适合单一的表影射操作。比如你可以把一个客户表对应做成一个CMP(其实.NET里的CMP是对存储过程的映射)
    BMP比较适合一组负责业务的操作。比如你可以把一个财务三级报表做成一个BMP。
     

    《ASP.NET电子商务高级编程》一书的作者kevin hoffman首先在.NET里实现了CMP机制。

    现在看来,这个架构需要一些改进,但是我还是给大家提供源程序,以便大家查看把。在我的QQ共享里,我上线的时候大家可以下载下来。路径如下

    qq:\\我的QQ\资料\code\vip\电子商务高级编程


    群外的朋友到这里下载源码
    http://support.apress.com/code_listing.asp?s=0&view=all
    上面的地址包含大多乐思已经出版的书的源码下载,那本书叫ASP.NET E-Commerce Programming; Problem - Design - Solution,你们直接下载那本书的源码就行了,里面有readme文件,英文的,看一下就知道怎么调试了。

    关于这本书里的架构的介绍很少,我以前写锅一篇文章,地址如下

    http://onlytiancai.cnblogs.com/archive/2005/07/06/187111.aspx

    其实有好多人正在用.NET CMP这个东西,现在已经发现了这个架构里的一些BUG,比如conn泄漏,没有对数据并发和事务的内置支持等,而且ADO.NET 2.0里有一些新的特性使开发人员可以更方便的开发数据库应用程序,而且开发出的程序更强壮。所以我感觉现在是可以用ado.net 2.0重写这个CMP架构,让它以ADO.NET 2.0为核心,并内置对并发和事务的支持。
    ado.net 2.0新特性的链接
    http://editblog.csdn.net/msdncolumn/archive/2005/02/25/1658.aspx

    希望博客园有模式和架构的爱好者给这次CMP的升级提出一些建议哦。

  • 相关阅读:
    白话LINQ系列2以代码演进方式学习LINQ必备条件
    《Entity Framework 6 Recipes》中文翻译系列 (9) 第二章 实体数据建模基础之继承关系映射TPH
    Linq To Sqlite 一一二二
    《Entity Framework 6 Recipes》中文翻译系列 (10) 第二章 实体数据建模基础之两实体间Isa和Hasa关系建模、嵌入值映射
    《Entity Framework 6 Recipes》中文翻译系列 (14) 第三章 查询之查询中设置默认值和存储过程返回多结果集
    《Entity Framework 6 Recipes》中文翻译系列 (13) 第三章 查询之使用Entity SQL
    白话LINQ系列1什么是LINQ?
    《Entity Framework 6 Recipes》翻译系列 (3) 第二章 实体数据建模基础之创建一个简单的模型
    JS 实现trim()
    mysql表切换引擎的几种方法
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/235998.html
Copyright © 2011-2022 走看看