随笔-65  评论-1102  文章-2  trackbacks-39

对于数据分层的概念想必大家都看的很多了.在这里我就不再罗嗦..不说理论.只说实际.以下内容大部分是以ASP.NET角度出发.

首先:采用分层前,要考虑自己的需求.不要为了跟潮流,看别人分层我也要分层.这样的思想只会使自己更麻烦.我的建议,对于小项目,如果后期需要周期性的扩展,或者需求会经常改变.可以考虑分层实现..如果只是一个中小企业的网站.需求经常不会改变的.而且大部分的功能都是以前做过的,完全可以直接ASPX+ASPX.CS..

其次:对于分层没有一个标准.也没有一个硬性的规则.分层的主要是目的是让项目能够灵活,便于管理和扩展.分层的后代码应该是很少见到甚至见不到重复出现的代码片段.我就曾见过有的分层,每个层中都会有重复的功能或者类似的功能代码..而这些重复的功能模块只是因为传递的参数不同或者返回的参数不同而重新写了类似的代码..这样的代码完全可以分割为更小的模块.重新封套再组合..比如,饮料,茶水,他们虽然是不同的产品,但是他们确有同样的物质成分--水..
饮料可以分为:水和其他物质,
茶水可以分为:水和茶叶
这样拆分后就看出来他们共同的物质是:水!面向对象编程的思想也是这样..要做到最大的灵活度.就需要从功能上分割.

最后:对于ASP.NET来说,决定性能的关键就是网络传输的大小,传输的Data越大则性能消耗就越大.而优化性能的关键是对数据库的优化.我的建议是:尽可能的将你的SQL语句缓存,一起执行.避免下列行为的发生:

SqlCommand com = new SqlCommand("select * from table1",conn);
dr 
= com.executeReader();
com.CommandText 
= "select * from table2";
dr 
= com.executeReader();
com.CommandText 
= "select * from table3";
dr 
= com.executeReader();

这样频繁的读取数据是很消耗资源的..其实完全可以写成存储过程,然后一次执行赋予SqlDataReader或者DataSet..如果SqlDataReader自身有多张表的话,SqlDataReader的NextResult()方法可以操作多表.
对于数据库层中的传输,大家用DataSet比较多.如果需要通过DataSet往返数据层与业务层..可以考虑使用DataSet的GetChanges()函数.他返回DataSet中只改变的记录..然后将改变后的DataSet用Merge()添加到业务层中..

以上内容只是为了说明:不要人家说好就是好,人家能用的我也能用,关键是要适合自己,能适合自己的需求才是最重要!

今天暂时写到这里,过几天找时间再继续写..今天可是冒着生命危险写的哦..

链接:我对分层的理解(二)

posted on 2005-08-02 16:34 难得一蠢 阅读(1718) 评论(11)  编辑 收藏 所属分类: 思绪随说

评论:
#1楼  2005-08-02 16:53 | FantasySoft      
功能划分并不一定等于分层。 所谓层就应该存在抽象接口和具体实现两个方面,第N+1层的具体实现基于第N层提供的接口。

BTW: 文中的SQL写错了。

  回复  引用  查看    
#2楼 [楼主] 2005-08-02 17:00 | 难得一蠢      
功能的划分在层中也是很重要的..所以我才放在文章中讲出来的哦..

写文章的时候,偶是在上班..打的快了点.错别字比较多.多多包含了..
  回复  引用  查看    
#3楼  2005-08-03 11:08 | Boler Guo      
有一些是没必要分那么多层,但是至少也要有一个专门的文件来作为数据访问层,就是执行SQL语句或者SP呀~
  回复  引用  查看    
#4楼 [楼主] 2005-08-03 11:51 | 难得一蠢      
分层还是要根据自己对项目的理解来做..就如文章所说的.对于小的项目.或者以后不经常更新扩展的项目..例如中小企业网站等等.因为时间紧,要求低,就没分层的必要.
  回复  引用  查看    
#5楼  2005-08-03 16:48 | XXX [未注册用户]
SqlCommand com = new SqlCommand("select * from table1",conn);
dr = com.executeReader();
com.CommandText = "select * from table2";
dr = com.executeReader();
com.CommandText = "select * from table3";
dr = com.executeReader();


不明白得是这样如何耗费资源了,同样是返回一样得数据,用同一个连接得话,我觉得他得效率应该都差不多。
只是这种写法代码多了点,而已。
  回复  引用    
#6楼  2005-08-03 16:52 | XXX2 [未注册用户]
XXX2
  回复  引用    
#7楼  2005-08-03 17:02 | 难得一蠢 [未注册用户]
SqlCommand com = new SqlCommand("select * from table1",conn);
dr = com.executeReader();
com.CommandText = "select * from table2";
dr = com.executeReader();
com.CommandText = "select * from table3";
dr = com.executeReader();

这样的沉淀代码在用户较少的时候或许并不明显,但是用户访问大的时候速度会比较明显的..因为运行executeReader()一次,SqlCommand就读取数据库中的记录一次,如果使用存储过程,对于N次的读取则只需SqlCommand读取一次便可以满足你的需求而且对于速度都是一个提高.最重要的一点是,存储过程是加载在缓存中..下次读取的时候速度是很快的..
  回复  引用    
#8楼  2005-08-03 17:39 | XXX [未注册用户]
其实他们之间得性能差异相当小,dr = com.executeReader(); 返回得是一个IdataReader其实这个时候系统还未从数据库读取数据(类似于游标),返回得只是一个访问数据得通道。
在执行效率方面以前我用LoadRunner 7.0做过压力测试:用一条SQL语句返回多个结果集合和调用多次数据库执行返回多个结果集合他们之间得差异相当小,在0.0X秒-0.x秒之间。
一条SQL语句防回多个记录集得话,对以后扩展不是太好。
  回复  引用    
#9楼  2005-08-04 07:43 | lixianhuei [未注册用户]
请教一下,为什么对扩展不好呢?
我觉得存储过程对于以后的扩展都是很方便的.类似关联的SQL语句封装在存储过程中,不管是对于CS代码,或者以后的维护管理,性能,安全都是有必要的.
  回复  引用    
#10楼  2005-09-01 09:57 | 守望红木[吴]      
其实都是有道理的,呵呵。一般来说还是要看具体的开发环境。我们大多数开发人员所在的公司都是小公司,没有完备的数据库人员,需要开发人员来写数据库方面的代码,这就是一个错误的开始!
如果你们有专门的数据库人员,那么让他专门给你写功能的存储过程确实很好;如果没有,我宁愿自己写SQL来。这样控制范围在代码,我不用且换到那么多环境才能完成功能!@
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-12-29 14:13 编辑过


相关链接: