论坛首页 综合技术版 Database

存储过程真的好快!

浏览 17604 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
最后更新时间:2008-05-07
robbin 写道
暂且不谈开发效率、维护性的问题,业务逻辑用存储过程来实现最大的危害在于,你没有办法进行群集扩展!

金融和电信行业的确在数据库服务器的硬件投资少不会吝惜,但是数据库服务器是单点的,极难扩展,即便Oracle的群集,他的共享存储数据库也是单点的,如果业务逻辑的运算非常消耗CPU和IO,你没有任何有效的办法来扩展系统的性能。

对于并非极度依赖数据的业务逻辑运算,如果在应用服务器端来实现的话,特别是采用SNA架构的情况下,理论上可以获得无限的水平扩展能力,只要加服务器就行了。但如果你放在数据库里面,你就大眼瞪小眼了,加服务器都不管用了。

对于那些对于性能要求极度苛刻的大负载应用,比方说阿里巴巴,拥有中国最强的Oracle DBA团队,已经把Oracle的配置优化到极限,已经把SQL优化到极限了。他们绝对不允许程序员把业务逻辑写成存储过程,甚至不允许程序员创建触发器、不允许程序员创建表的外键约束,外键关系自己在程序里面维护。凡是能够在应用层进行检查的工作绝不能放在数据库层,加重数据库服务器的负担。

我只希望大家记住一点:数据库服务器出现CPU和IO瓶颈,你没有办法扩展,但是应用服务器出现CPU和IO瓶颈,你只需要加服务器就行了。




对于并非极度依赖数据的业务逻辑运算,如果在应用服务器端来实现的话,特别是采用SNA架构的情况下,理论上可以获得无限的水平扩展能力,只要加服务器就行了。但如果你放在数据库里面,你就大眼瞪小眼了,加服务器都不管用了
--
这儿robbin加了一个条件,对于并非极度依赖数据的业务逻辑运算。加得很好。

所以,关于PL/SQL有两点想说一下:

1.非极度依赖数据库的业务逻辑,我想不会有人放到PL/SQL中去。

2.设放在pl/sql里的都是那种极度依赖数据的业务逻辑(我们公司就是这样)。
来来回回的找表运算,来来回回,运算。
这种运算。你从PL/SQL中抽出,现在放到应用端来做。
好,过了一年,发现数据量大了,速度不够用了。
这个时候你加应用服务器有用吗?没有用,加再多都不行。
因为真正的耗时最终还是被传递到DB上面。你只能加强,优化DB。没有别的办法。
   
0 请登录后投票
最后更新时间:2008-05-07
robbin 写道
phlsbg 写道
我只希望大家记住一点:数据库服务器出现CPU和IO瓶颈,你没有办法扩展,但是应用服务器出现CPU和IO瓶颈,你只需要加服务器就行了。

robbin 你能给出一个具体的数字么?究竟提高到什么程度?

当然JavaEye这类网站这类的应用,我是同意的观点。
   我想这个帖子是在业务系统为主的前提下
      

比方说我2005年给X行咨询的一个关于全行票据交易的项目,很繁重的业务运算,一开始跑的还挺快,但上了十几个省的分行以后,一个WebSphere顶不住了,繁忙的时候页面响应很慢,几乎出不来了。于是我们做了水平和垂直群集,两台HP9000的小型机跑应用服务器,每台小型机上面跑两个WebSphere实例,做垂直群集,小型机之间再做水平群集。总共是4个WebSphere实例的群集,这下业务系统就恢复了正常。等全国30省的所有分行全部开放以后,每天还是跑得稳稳的。如果业务量再大,还可以继续添加服务器和WebSphere实例。如果你都把业务放在数据库里面实现,我看你怎么扩展数据库和硬件?



问个问题,这些繁重的业务运算严重依赖数据库吗?
   
0 请登录后投票
最后更新时间:2008-05-07
引用
2.设放在pl/sql里的都是那种极度依赖数据的业务逻辑(我们公司就是这样)。
来来回回的找表运算,来来回回,运算。
这种运算。你从PL/SQL中抽出,现在放到应用端来做。
好,过了一年,发现数据量大了,速度不够用了。
这个时候你加应用服务器有用吗?没有用,加再多都不行。
因为真正的耗时最终还是被传递到DB上面。你只能加强,优化DB。没有别的办法。


对于大数据量的OLAP运算,根本不能放在应用服务器端来执行。因为很容易就会让你的应用服务器内存溢出,导致你整个业务系统无法访问。

对于企业应用来说,有的是OLTP型的,有的是OLAP型的,也有兼而有之的。对于OLTP型的应用逻辑一定要放在应用服务器来执行,而对于OLAP型的应用的确适合使用存储过程来实现,用应用服务器去运算根本不行。不过一般说来,大部分的OLAP运算并不是实时性要求很高的,所以往往可以用存储过程实现以后,作为后台任务定期执行,这些后台任务往往会执行好几个小时才能结束,然后把执行结果保存下来。让应用服务器在展示报表的时候读取最终查询结果。
   
0 请登录后投票
最后更新时间:2008-05-07
WebSphere集群主要解决的是什么问题?和存储过程有关系么?


web集群、中间件集群、数据库集群每个层面都有自己主要解决的领域

因为真正的耗时最终还是被传递到DB上面。你只能加强,优化DB。没有别的办法。
   
0 请登录后投票
最后更新时间:2008-05-07
phlsbg 写道
WebSphere集群主要解决的是什么问题?和存储过程有关系么?


web集群、中间件集群、数据库集群每个层面都有自己主要解决的领域

因为真正的耗时最终还是被传递到DB上面。你只能加强,优化DB。没有别的办法。


应用服务器群集和存储过程本来没有什么关系。但如果有人说,业务逻辑应该写在存储过程里面,就有非常大的关系了。而这个帖子所要讨论的问题就是:业务逻辑究竟应该还不应该写在存储过程里面。显然很多人认为:不管三七二十一,业务逻辑都应该放在存储过程里面。

而我要告诉大家的是,除了那些对大数据处理非常依赖的操作,其他所有的业务逻辑统统不应该用存储过程来实现,而应该放在应用服务器层实现。而WebSphere群集解决的就是当应用层业务逻辑负载太大的情况下,如何进行扩展的问题。

不过话说回来,并不是每个企业应用的瓶颈都在数据库端,即便瓶颈在数据库端,不一定非要通过优化DB来解决,其他的办法多的是。
   
0 请登录后投票
最后更新时间:2008-05-07
任何问题不要一刀切,要么都放在Java中,要么都放在存储过程中

然很多人认为:不管三七二十一,业务逻辑都应该放在存储过程里面。
同理,
然很多人认为:不管三七二十一,业务逻辑都应该放在Java中。
   
0 请登录后投票
最后更新时间:2008-05-08
我喜欢存储过程和pro*c,,高性能的运算平台,在业务电信行业的支撑系统,八达通卡积分管理系统,我们的业务流程全是oracle存储过程来写..每个业务都配置好非常详细的Visio流程图,并为每每个业务流程编写有相应的存储过程测试代码..非常的高效能,没有维护不方便的问题,主要还是看项目团队的技术水平
   
0 请登录后投票
最后更新时间:2008-05-10
每个人的业务背景不同,容易得出不同的结论。
对于电信金融行业,你叫他时不时转数据库,是完全不可能的,存储过程很好很强大。
对于短平快的行业软件产品,你叫他绑定数据库,是会影响这软件的销售的。所以,ORM就显得有必要。
呵,一句话,业务决定技术。
   
9 请登录后投票
最后更新时间:2008-05-08
ironsabre 写道
ltian 写道
N年前大量的业务逻辑程序就是存储过程干的。除了调试不方便外,用存储过程业务法满足跨数据库的需要,今天A客户用ORacle,明天B客户用sybase。这个问题如何解决?
另外大量采用存储过程进行业务逻辑的开发致命的缺点是很多存储过程不支持面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,从而无法形成通用的可支持复用的业务逻辑框架。
不过,在对性能影响较大的时候在局部采用一个存储过程也可以的,但是目前几乎很少碰到性能到了用户无法接受情况。
我所见到的有些系统大量采用了存储过程,由于对游标等对象操作不当,导致系统整体性能不佳的情况框也很多。上千行乃至几千行的存储过程在这些系统中比比皆是,最后导致很难维护。


首先,你所说的存储过程调试不方便是不存在的。在用对了工具时,存储过程的调试对于数据库应用来说,比其他语言都更为方便。用一下PL/SQL Developer试一下。

第二:A客户要用Oracle,B客户要用sybase的问题。很好解决,我们只提供Oracle版本的产品。就算是和IBM合作,也没有使用DB2。Oracle就是比其他数据库好,没有办法。当然Oracle也是最贵的,但是对于大型项目来说,我们的客户不会在乎数据库的价格。这是他必须要付出的。

第三:关于存储过程维护难的问题,更是可笑。我们的核心计算几乎全部是PL/SQL写出来的。经常会有写得极好的成千上万行的PL/SQL存在。而对于Java来说,我觉得面像对象的东西,很多个Class写在那儿,可真正专注于计算的,也就是几行。大多数Java没有在计算,但Java可以用来搭出很好的架子来。我们公司的做法就是Java搭架子 + PL/SQL的核心计算。极好。关于这个做法,就我所知,在真正需要强大计算的金融保险行业极为流行。这是实践出来的东西。

也许那些只是简单的CRUD的应用,才会觉得PL/SQL没什么用。




这位哥们,能否说一下你们现在的做法,和你所说的架子是怎样搭建的?普通的MVC模式?

我现在手头上也有一个项目,是维护性的,03年的项目了,只是普通的MVC+ORACLE,所有业务逻辑全部用PL/SQL来写,因为规范得很好,所以维护起来没有什么问题。只是对于新进的开发人员,培训时间较长,因为需要让他们了解很多的表关系。而表却非常多,数百个,非常的苦闷。
   
0 请登录后投票
最后更新时间:2008-05-09
魔力猫咪 写道
后头有你叫的时候。大量业务写入存储过程,对调试和修改均极为不方便。我觉得你这种业务用缓存的方式解决最好。处理一次,缓存起来。没了查询数据库,不是更快。等缓存失效了,才需要二次运算。缓存时限可以根据你的需求定,哪怕有1分钟,对高并发的访问都是可以大大缓解的。


无比多的大型应用都有SP,银行的更多。

对于简单的CURD,自然不需要SP。但是日常业务除了CURD外,还牵涉到大料的报表操作,银行来说,日报,旬报,月报,季度报,年报,这些跨多表查询汇总的东西,自然轮到SP大显身手。
   
0 请登录后投票
论坛首页 综合技术版 Database

跳转论坛:
JavaEye推荐