存储过程与业务类实现业务的差异比较

以下比较不太全面,纯粹是个人的理解。可能是针对前一篇文章的补充与说明

1、批量数据的处理比较

业务逻辑:单位A部门划转到B部门,业务规则是把A部门的100人的关联单位改为B部门,同时在人员岗位变化子表里增加一条变动记录。

业务实现:

1)存储过程实现(SP实现)(两个SQL语句)

insert into 岗位变化子表(变化前部门、变化前岗位、变化后部门、变化后岗位、生效时间、操作人、操作时间) select A,岗位,B,岗位,sysdate,当前登录用户,sysdate from 员工表 where 部门ID=A;--完成插入100条子表的数据

update 员工表 set 部门ID=B where 部门ID=A; --更新员工的部门关联

commit; --最后提交,SP本身就开启了事务机制,所以可以放心操作。

2)业务类实现1(符合面向对象的原则)

获得A部门员工对象,一般是100个员工对象的Collection,即生成的SQL语句是把所有的员工表的字段都查询出来,然后循环进行员工对象属性的变更与保存、子对象的创建与保存等业务。

3)业务类实现2(有点不太符合面向对象的原则,但效率肯定比前面一种高)

按SP方式执行SQL语句。当然要注意开启事务处理,否则可能会产生垃圾数据哟。

当然可能还有除了这三种之外的实现方式,但这三种应该是最常见的了。其它的内容这里就不展开说了。希望非专业人士可以看明白。专业人士可以自行计算一下数据库连接的次数及需要传输的数据量。

需求变更:增加操作IP的记录

所有都要做的事情:增加【岗位变化子表】数据表字段:操作IP

1)SP调整

增加参数IP,修改第一条insert语句即可。

关联修改:调用存储过程方法重新调整。重新编译发布

2)业务实现1

修改岗位变化子表的实体类。(一般是重新生成即可)

修改业务逻辑类

重新编译发布

3)业务实现2

修改岗位变化子表的实体类。(一般是重新生成即可)

修改SQL语句

重新编译发布

 

2、数据统计类

业务逻辑:定时(每小时或每天)更新用户排行榜(如积分排行榜),假设用户积分数据8千万条数据。

业务实现:SP的方式

创建一个Job队列执行设定的存储过程,把统计的结果存到积分排行榜的数据表里。

适应需求变化:统计的规则可能经常变化,特别是积分系统的调整也是非常频繁的(可能一周就会有一次,特别是项目上线前期),存储过程可以很快的修改测试与部署。不需要指定专门的时间去停止所有的Web服务器更新应用来满足需求的变化。

先写这些吧,写东西太耗时间了。还是等压力测试的数据出来再做一些分析吧。

posted @ 2010-08-04 15:49 小草 阅读(2073) 评论(8) 编辑 收藏

 回复 引用 查看   
#1楼2010-08-04 15:57 | kiler      
需求变更:增加操作IP的记录

加字段其实简单,减掉一个字段,或者字段改名,sp开发者就要骂娘了。
sp写多了你根本就不知道你哪里用了这个字段,但是要用业务类的话,字段名字变了,ide是编译不过去的,马上就可以查出哪里用了

适应需求变化:统计的规则可能经常变化,特别是积分系统的调整也是非常频繁的(可能一周就会有一次,特别是项目上线前期),存储过程可以很快的修改测试与部署。不需要指定专门的时间去停止所有的Web服务器更新应用来满足需求的变化。

用业务类的话。不过是更新一下几个dll就可以了,不需要停止服务器啊。没觉得会比存储过程快多少。真正重要的系统存储过程也不是你想改就改的。

 回复 引用 查看   
#2楼[楼主]2010-08-04 16:54 | 小草      
@kiler
字段的删除与增加,也会动态影响存储过程的编译,所以可以在失效的存储过程中进行定位,Oracle是可以做到,其它的数据库我不太了解。

更新Web应用可能会有一些更好的解决办法。

 回复 引用 查看   
#3楼2010-08-04 22:41 | 缪军      
修改字段,就要修改sp?
还要修改应用程序,重新发布?
照你们这么说,用友金蝶都不要混了,
你看看他们的程序,不要说修改字段,你就是添加表都不需要重新发布程序的

随便贴2行我写的代码,你们就知道实现这点非常容易,这些代码根本就是数据无关的:
Collection<StyleSoft.Common2.Model.MethodParamInfo> 
//项目文档从模型加载参数集合,并且自行与视图匹配获得用户输入的值
_Params =
            AppCenter2.Controller.MethodDrv.GetParamValues(MyApp.AppKey, "CheckCaseSearchByCaseCode1");
 //提交DA
        DataTable _DT = MyHelper.ExecuteSP(MyApp.ConnStr, _Params, "CheckCaseSearchByCaseCode1");


 回复 引用 查看   
#4楼[楼主]2010-08-05 00:14 | 小草      
@缪军
学习了。

 回复 引用 查看   
#5楼2010-08-05 10:20 | kiler      
引用缪军:
修改字段,就要修改sp?
还要修改应用程序,重新发布?
照你们这么说,用友金蝶都不要混了,
你看看他们的程序,不要说修改字段,你就是添加表都不需要重新发布程序的

随便贴2行我写的代码,你们就知道实现这点非常容易,这些代码根本就是数据无关的:
Collection<StyleSoft.Common2.Model.MethodParamInfo> 
//项目文档从模型加载参数集合,并且自行与视图匹配获得用户输入的值
_Params =
            AppCenter2.Controller.MethodDrv.GetParamValues(MyApp.AppKey, "CheckCaseSearchByCaseCode1");
 //提交DA
        DataTable _DT = MyHelper.ExecuteSP(MyApp.ConnStr, _Params, "CheckCaseSearchByCaseCode1");



成熟产品当然不需要,需要还叫产品吗。

我们讨论的是项目。

 回复 引用 查看   
#6楼2010-08-05 11:10 | rKnight      
引用SP本身就开启了事务机制,所以可以放心操作。


mssql? 这个默认是每个语句都提交吧?

 回复 引用 查看   
#7楼2010-08-05 23:40 | 缪军      
引用kiler:


我每个项目都是这样写的,
我不知道你说的项目跟我们平时做的项目有什么不同

 回复 引用 查看   
#8楼[楼主]2011-03-03 17:03 | 小草      
aaaaaa