蛙蛙推荐:简单介绍一下托管容器持久性(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的升级提出一些建议哦。