Fly with the wind-TerryDong

.NET on the way
posts - 13, comments - 37, trackbacks - 1, articles - 0

背景:

由于目前服务的公司,系统复杂度很高,数据库使用了Oracle、SqlServer、MySql......(就差用到所有的数据库产品了,呵呵)

系统重构的过程中,之前写的基于sqlserver的简单三层架构已经不能满足系统重构的需求...

 

需求:

支持多类型数据库

操作多个同一类型数据库

参考:

PetShop4.0

 

解决方案框架图

 

基于工厂的三层解决方案

 

数据访问工具类

数据访问类使用DbProviderFactory实现,方法在父类实现,子类中只需通过实现CreateInstance()方法来指定providerName和connectionString 即可,唯一遗憾的是Mysql数据库不能通过这种方式实现,需要再单独写数据访问类了。

数据访问类

 

研究过很多框架,包括开源的和微软的一些示例产品,个人觉得有的框架繁杂,有的or-mapping架构的效率不高,框架的DAL层和entity层可以用基于codeSmith的代码生成,这样会提高开发效率,系统可复用性也不错

 

数据访问类库网上有很多,大部分是需要具体实现每一类型的数据访问类,今天利用项目测试期的空闲,完成了DbBase和它的实现类DbSqlServer,DbOracle,DbOleDb,心情很不错:)

Terry Dong

Feedback

#1楼    回复  引用  查看    

2007-12-06 19:17 by Enzo      
Oracle、SqlServer、MySql一起用的,还是可选的啊?
一起用的话就太牛了

#2楼    回复  引用  查看    

2007-12-06 19:24 by 沙加      
这个啊~~~看看.NetTiers吧,你想要的它都有,只不过比较复杂你可修改一个简化版的出来用.

#3楼    回复  引用    

2007-12-06 23:02 by SoulHuang [未注册用户]
有没PetShop的CodeSmith模版??

懒人就会用.NetTiers

#4楼 [楼主]   回复  引用  查看    

2007-12-06 23:19 by Terry Dong      
to:沙加
.nettiers我以前给一个项目后台用过,代码依赖性很强,是基于存储过程的,不太适合复杂系统,而且系统迁移性,可维护性都不是很好,性能压力都在数据库那边

#5楼 [楼主]   回复  引用  查看    

2007-12-06 23:20 by Terry Dong      
to:Enzo
是一起用的,这也是利用工厂模式的原因

#6楼 [楼主]   回复  引用  查看    

2007-12-06 23:22 by Terry Dong      
to:SoulHuang
没有petshop的模板:)

#7楼 [楼主]   回复  引用  查看    

2007-12-06 23:25 by Terry Dong      
存储过程用的越少越好,业务逻辑最好写在逻辑层,虽然会增加一些开发时间,但对系统可读性、debug还有后期性能,维护都有好处,我的想法是除非是大数据量的分页用存储过程协助(当然Linq和Sql2005也可以避免使用分页存储过程),其它尽量不使用存储过程

#8楼    回复  引用    

2007-12-06 23:32 by 大柳树 [未注册用户]
真的不明白楼上说的存储过程用的越少越好是什么意思,好像微软有个建议,说是尽可能让数据库做最多的事情,因为一般情况下数据库总是很"闲"的

#9楼 [楼主]   回复  引用  查看    

2007-12-07 00:16 by Terry Dong      
存储过程带来的实际问题:

1.维护代价非常高,试想下很多N年前写的存储过程,一个数据库内包括的几百个存储过程的情况

2.性能方面,试想下,一个大型web在线实时系统,业务逻辑都在存储过程中,性能完全依靠数据库服务器的场景会是怎样,如果是性能分散到n个web服务器又会如何

3.编程性方面,如果一个存储过程的业务逻辑需要调用另外一个数据库的表或存储过程,需要链接的方式来联接,效能上一样有影响

当然如果基于sql的方式然后用各种join关联表去实现,性能上也会有问题。

以上是我在项目中遇到的几点原因,现在我们都是基于单表查询,逻辑层组合的方式。欢迎大家继续探讨,一起提高^_^

#10楼    回复  引用  查看    

2007-12-07 00:32 by Dreaming      
关于用存储过程的性能好处我的见解是:
1、预编译过,所以性能不会差去哪里
2、能维持很好的查询计划

当然,像博主那样需要用到数据工厂的,逻辑还是放在BLL合适点

#11楼    回复  引用    

2007-12-07 00:45 by 大柳树 [未注册用户]
“3.编程性方面,如果一个存储过程的业务逻辑需要调用另外一个数据库的表或存储过程,需要链接的方式来联接,效能上一样有影响 ”

这点说的很不错,一个逻辑中需要同时操作多数据库的时候性能确实影响不小,最近在看阿拉丁的地图的东西,他们用的存储过程也很少,不过他们设计的数据库也很垃圾,40个字段的表 一半没有用

#12楼    回复  引用  查看    

2007-12-07 04:35 by Vincent Yang      
不明白你这里跟工厂模式有什么关系,你只是用了微软的而已

#13楼    回复  引用  查看    

2007-12-07 07:36 by 苯苯的考拉熊      
--引用--------------------------------------------------
大柳树: 真的不明白楼上说的存储过程用的越少越好是什么意思,好像微软有个建议,说是尽可能让数据库做最多的事情,因为一般情况下数据库总是很"闲"的
--------------------------------------------------------

那要看你的系统了,我们这里的小型机,才不到100个Client,就是由于把大量的工作都放在了存储过程中,CPU长期50%以上。

#14楼    回复  引用  查看    

2007-12-07 09:06 by 辉郎      
呵呵,PetShop 4中确实有很多值得学习的地方。恭喜你,进入正途~~~~

#15楼    回复  引用  查看    

2007-12-07 09:28 by 沙加      
@Terry Dong
你说的不完全对,.NetTiers在生成时是可以配置的,完全可以不使用存储过程.使用它我看中的是方便的查询使用方法. 可以看看俺写的这个 http://www.cnblogs.com/darkangle/archive/2007/11/29/976493.html 它提供多库支持,只需要显式指定连接定串就好了.

另外,在大点的项目里面要管理一堆的SQL是相当不便的,最好是有一些ORM之类的工具来用. 我们现在的项目近50张表, 需求还经常变,要是自己写SQL,一改库的话SQL语句就得跟着变多累啊~~~

#16楼 [楼主]   回复  引用  查看    

2007-12-07 09:53 by Terry Dong      
@Vincent Yang

呵呵,应该写成基于工厂模式的三层.net平台解决方案

这只是工厂模式的.net应用而已,这个架构中BLL与DAL层是通过工厂模式实现多类型数据库支持的,数据访问类也是基于DbProviderFactory来封装的。

#17楼    回复  引用  查看    

2007-12-07 09:57 by CoolDog      
@沙加
@Terry Dong
我们开发的系统是基于三层架构的。最近需求有很多变动,尤其是要修改表结构时。开发的时候麻烦的很,需要修改很多地方。请问有没有更好的解决办法?

#18楼    回复  引用  查看    

2007-12-07 10:07 by CoolDog      
@苯苯的考拉熊
--引用--------------------------------------------------
苯苯的考拉熊: --引用--------------------------------------------------
大柳树: 真的不明白楼上说的存储过程用的越少越好是什么意思,好像微软有个建议,说是尽可能让数据库做最多的事情,因为一般情况下数据库总是很"闲"的
--------------------------------------------------------

那要看你的系统了,我们这里的小型机,才不到100个Client,就是由于把大量的工作都放在了存储过程中,CPU长期50%以上。
--------------------------------------------------------
楼主的意思是:如果大型系统就写存储过程,如果小型系统就写SQL语句了?写SQL语句也很难维护的啊?为了以后的开发是不是建议用存储过程呢

#19楼 [楼主]   回复  引用  查看    

2007-12-07 10:30 by Terry Dong      
--引用--------------------------------------------------
CoolDog: @沙加
@Terry Dong
我们开发的系统是基于三层架构的。最近需求有很多变动,尤其是要修改表结构时。开发的时候麻烦的很,需要修改很多地方。请问有没有更好的解决办法?

--------------------------------------------------------
表结构改动很大,这对项目的影响确实很大,我现在公司的项目的几个主表都在重构ing。。。

如果是旧系统升级,要看原来系统实现的方式了
可能会对存储过程,sql,实体都要优化,如果你们原来架构的分层还不错,逻辑层和UI层应该不用改动太大吧。

如果新开发,有几种选择吧
1.基于代码生成的方式,可以根据数据库生成dal,entity,这样每次数据库更新再重复生成即可,dal的类最好写成partial类的,当然自己扩展的方法还是要手工改动的。
2.基于or-mapping的,也可以通过or-mapping工具做配置

希望对你有点帮助

#20楼 [楼主]   回复  引用  查看    

2007-12-07 10:34 by Terry Dong      
其实项目选型有多种方案,选择适合的项目类型就好了,各有利弊的

存储过程是提醒大家慎用,sql也有维护的问题,这些都依赖于编码是否规范

我公司原来写的存储过程,每个数据库就几百个,很多都是200多行代码,没注释,没文档,没规范。。。可谓人走茶凉。所以大家适当选择取舍吧,嘿嘿

#21楼    回复  引用  查看    

2007-12-07 10:42 by endision      
asfasdf

#22楼    回复  引用  查看    

2007-12-07 12:21 by CoolDog      
多谢楼主指点。

--引用--------------------------------------------------
Terry Dong: --引用--------------------------------------------------
CoolDog: @沙加
@Terry Dong
我们开发的系统是基于三层架构的。最近需求有很多变动,尤其是要修改表结构时。开发的时候麻烦的很,需要修改很多地方。请问有没有更好的解决办法?

--------------------------------------------------------
表结构改动很大,这对项目的影响确实很大,我现在公司的项目的几个主表都在重构ing。。。

如果是旧系统升级,要看原来系统实现的方式了
可能会对存储过程,sql,实体都要优化,如果你们原来架构的分层还不错,逻辑层和UI层应该不用改动太大吧。

如果新开发,有几种选择吧
1.基于代码生成的方式,可以根据数据库生成dal,entity,这样每次数据库更新再重复生成即可,dal的类最好写成partial类的,当然自己扩展的方法还是要手工改动的。
2.基于or-mapping的,也可以通过or-mapping工具做配置

希望对你有点帮助
--------------------------------------------------------

#23楼    回复  引用  查看    

2007-12-07 12:23 by CoolDog      
规范很重要,注释也很重要。偶是新手,学到了点。谢谢楼主

--引用--------------------------------------------------
Terry Dong: 其实项目选型有多种方案,选择适合的项目类型就好了,各有利弊的

存储过程是提醒大家慎用,sql也有维护的问题,这些都依赖于编码是否规范

我公司原来写的存储过程,每个数据库就几百个,很多都是200多行代码,没注释,没文档,没规范。。。可谓人走茶凉。所以大家适当选择取舍吧,嘿嘿
--------------------------------------------------------

#24楼    回复  引用  查看    

2007-12-07 15:32 by henry      
只要开始设计的时候是针对接口编辑,事情就并不是想像中复杂.

#25楼    回复  引用  查看    

2007-12-08 00:44 by ColdDog      
--引用--------------------------------------------------
大柳树: 真的不明白楼上说的存储过程用的越少越好是什么意思,好像微软有个建议,说是尽可能让数据库做最多的事情,因为一般情况下数据库总是很"闲"的
--------------------------------------------------------
SqlServer2005很强了,帮你做了很多事

#26楼    回复  引用  查看    

2007-12-08 00:47 by ColdDog      
我也正准备结合工作实际,参照些成熟框架,自己总结出一套方案,虽然说不会有什么大用途,至少对个人学习和提高还是很有帮助的。

#27楼    回复  引用    

2007-12-11 09:56 by -kd [未注册用户]
有个专门针对工厂模式三层的代码生成器,下载地址http://www.maticsoft.com/softdown.aspx

#28楼    回复  引用  查看    

2008-05-27 18:49 by 星期六      
能否给个DbProviderFactory连接mysql数据库的列子?
zhmvb@tom.com 非常感谢。

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