论坛首页 综合技术论坛

探讨用存储过程的优劣

浏览 84034 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-01-24  
liangguanhui 写道
ironsabre 写道
fnet 写道
全部用存储过程,等于把业务层也要搬到数据库里,数据库端得承受多大压力啊。

其实最关键的,跨数据库麻烦的很,所有业务sql要重写。整天盯着看一串串的存储过程也挺恶心的。


大部分企业应用的业务层也都是基于数据库的,就算你表面上把逻辑都放在业务层,
最后实际的压力绝大多数一样被直接传导到数据库端。
你想想,你的所谓业务层里边,真正的逻辑计算用时多少,数据库操作用时多少。
基本上,绝大部分时间都是数据库操作用时。


天天考虑换数据库的话,那等于买个Oracle当mysql使了。
我做了这么多年金融核心系统,还没听过换过数据库。


从来就没有人在做系统的时候认为换数据库是一个需要考虑的可选项。

CRUD简单系统换数据库有可能,真正复杂的业务系统换数据库等于自杀。
CRUD的简单系统你本来也没有什么需要用到sp的地方。


这才是大实话啊。把Oracle当MySQL用,还真是把钱不当钱啊!

不过话又说回来,在国内的一些小公司的小系统,换数据库是家常便饭,所以Hibernate才会这么爽——因为换数据库不需要改大量代码。


为什么会经常变换数据库??做hibernate插件的??
0 请登录后投票
   发表时间:2011-01-24  
ray_linn 写道
魔力猫咪 写道
1. 投资少。
真的少吗?存储过程本身如果预编译的话好像要单独购买许可证。

2. 速度快
在整个系统中,某点的速度是否是瓶颈。速度带来的成本是否能被抵消掉是需要认真思考的。动态脚本语言比Java等语言动辄慢几十上百倍。但是做出来的程序很多时候看起来性能并没有什么差距。SP的维护成本和迁移成本高于Java等语言。
3. 复用最强的是SOA。搭建的基础是webservice等松耦合技术,而不是数据库驱动程序。
4.调优容易
调优是系统整体工程。不单单是优化数据库。



1. 你到说说你哪个数据库需要预编译购买许可证?你自己都不确定能当成论据吗?

2. 兔子和兔子比,才能说是世界上跑得最快的兔子。兔子和乌龟比,能说是世界上那个跑得最快的兔子么。你这种论调就是让兔子和乌龟去比。JDBC(或者其他什么机车)送上100句SQL以便做出个表格永远就是比这100句SQL写入SP慢,这才是兔子和兔子比。性能的提升就意味着更少的投资。至于所谓的维护成本和迁移成本,就有点臆测的味道了。

3. SOA强虽强,却是性能低下的方案,而且还需要额外的投资。假如SP就可以胜任,为什么要用只笨乌龟来担当呢?

SOA暴露的只是接口,其商业逻辑还是可以存在SP,SOA作为SP的一种Client而已。例如银行的日报、月报、季度报、年报这种动则要存取上百个表的逻辑,SOA能搞得定吗?还不是交给后台的SP来处理。

4. 你调过吗?


基本上你说的意见就是上面那位同学说的: 1是错的,2,3,4全是废话。


1 DB2的部分版本是需要C编译器编译存储过程的。这个C编译器要花钱购买或者使用免费的GCC。而且有时候SQL运行速度不够,其中一个解决办法就是用C、Java等语言开发存储过程。编译后在数据库中运行。这个功能有的数据库是需要额外花钱的。
2.应用缓存可以极大缓解数据库IO压力。我从内存里拿总比你从远程IO取快。只要设计合理,缓存的命中率还是非常高的。
3.你直接把数据库放公网提供SP服务试试去。报表什么的是数据仓库、智能BI的事情,关SOA什么事情。
4.别用这种腔调说话。


0 请登录后投票
   发表时间:2011-01-24  
金融系统的 Oracle 肯定不能随便换了。囧,这不完全是个技术问题。

需要换数据库的场合当然也是很多。有时候是个卖点

个人认为在项目型开发当中可以用 sp。 做产品最好就不要用了
0 请登录后投票
   发表时间:2011-01-24  
魔力猫咪 写道
lym6520 写道
个人觉得,对于复杂的、容易经常修改的业务应该放到存储过程里处理。

动态脚本语言以及规则引擎才是归宿。


规则引擎你用过吗?我的痛苦经历告诉我,最好不要去用。
把简单的事情复杂化,复杂的事情又做不了。
调试是个恶梦。
0 请登录后投票
   发表时间:2011-01-24  
说说存储过程的缺点吧:
1.运维复杂,业务变化导致的存储过程变化太难受,个人的切身体会,特别是存储过程长的时候:一.可读性太差,如果中间被人改个两三次,就更难受了,如果涉及到三、四个表,不懂业务的就很难读懂了;二.可复用性差,这是过程代码的典型劣势,不是说它没有复用性,但它的复用性和面向对象比起来是差一大截的;三.可维护性差,版本控制很难搞,不像代码环境能集成版本控制软件;且主、备和开发环境的不能随时同步。
2.不能使用对象缓存,也就是说客户请求除了少部分通过客户端缓存和页面缓存,大部分请求都直接捅到数据库了,浪费了利用应用服务器资源的机会。
0 请登录后投票
   发表时间:2011-01-24  
SOA只是公共通讯接口,它能帮你做真正的业务吗?你拿SOA跟SP说事,真是有意思。
我SOA真正要做的事情可以用任何东西来实现,包括SP。
这两个东西根本不应该扯到一起来。
不过在SOA没有出来之前,SP在很多时候可以充当一部分SOA的角色,它是一种中间性的语言,任何其它语言都可以调用过。比如计算保费,我把逻辑放在p_calc_prem里。
然后任何client(java,c,vb,etc..)端都可以调用它。
0 请登录后投票
   发表时间:2011-01-24  
liuchuan98 写道
说说存储过程的缺点吧:
1.运维复杂,业务变化导致的存储过程变化太难受,个人的切身体会,特别是存储过程长的时候:一.可读性太差,如果中间被人改个两三次,就更难受了,如果涉及到三、四个表,不懂业务的就很难读懂了;二.可复用性差,这是过程代码的典型劣势,不是说它没有复用性,但它的复用性和面向对象比起来是差一大截的;三.可维护性差,版本控制很难搞,不像代码环境能集成版本控制软件;且主、备和开发环境的不能随时同步。
2.不能使用对象缓存,也就是说客户请求除了少部分通过客户端缓存和页面缓存,大部分请求都直接捅到数据库了,浪费了利用应用服务器资源的机会。


已经有三个人说过版本控制很难搞了,我问了前面两个人,都没有回答我,请你来告诉我,sp的版本控制跟java有什么区别。请告诉我,一定要告诉我。

还有你前面说的可读性差什么的跟sp没任何关系。你写Java一样可以一个类写1万行。这是程序员的水平问题。
从来没有人说过sp就是一个过程到底的。
0 请登录后投票
   发表时间:2011-01-24  
魔力猫咪 写道

1 DB2的部分版本是需要C编译器编译存储过程的。这个C编译器要花钱购买或者使用免费的GCC。而且有时候SQL运行速度不够,其中一个解决办法就是用C、Java等语言开发存储过程。编译后在数据库中运行。这个功能有的数据库是需要额外花钱的。
2.应用缓存可以极大缓解数据库IO压力。我从内存里拿总比你从远程IO取快。只要设计合理,缓存的命中率还是非常高的。
3.你直接把数据库放公网提供SP服务试试去。报表什么的是数据仓库、智能BI的事情,关SOA什么事情。
4.别用这种腔调说话。



1. 就是DB2,也可以用GCC搞定,你自己都无法说明会提高成本。即使购买这块,也比weblogic, websphere便宜吧?

2. 又拿缓存说事。1.缓存不适合多系统共同一个DB,在企业中用武之地根本就不大,物料系统、质量系统、生产系统,你用用缓存看看,老板早就削死你了。缓存就是适合像java前台纷纷扰扰,后台数据一个的场景,这种小玩意用什么SP,基本都是CRUD。 2. SP用不了缓存吗?前端用个ibatis后端用个SP,不照样享受花村。

3. 我原文说的就是企业内部异构系统,你非扯到公网。
0 请登录后投票
   发表时间:2011-01-24  
sp的版本控制跟java版本控制有什么区别??
快回答,难道cvs不能check in sp文件???
你们在搞什么。快回答。
0 请登录后投票
   发表时间:2011-01-24  
一.可读性太差,如果中间被人改个两三次,就更难受了,如果涉及到三、四个表,不懂业务的就很难读懂了;
-------------------
你不懂业务的,我把这些代码从sp里移到Java里你就能看懂了?太神奇了。


0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics