论坛首页 综合技术论坛

探讨用存储过程的优劣

浏览 84570 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-01-19  
xiaoshan5634 写道
使用存储过程的优点:
1.开发速度非常快,基本上一个增删改查一个小时就能搞定
2.可以实时的更新业务逻辑代码不需要重新编译java代码,对于业务逻辑经常变的系统这点很有帮助
缺点:
1.数据量大时,对数据库的压力就非常大
2.对于热门资源访问量较大,容易形成堵塞,若存储过程写的不好,容易产生死锁。web层可以很容易无限的横向扩展,但数据库就只有一个,一但数据库堵塞了,整个系统也就差不多要挂掉了。使用存储过程会增加数据库服务器的负担。

我们公司就是将业务都写在存储过程里,现在经常都会堵塞,快要下班时系统就很慢。我们想了很多办法,将使用非常频繁且对数据库有压力的查询使用Lucene来完成。页面静态化,减少用户对数据库的访问。现在数据库的压力还是无法释放,正考虑换sql server2008,能将数据库的内存加到12G,可以缓解一点数据库的压力。


+1

其实SP还有一个很重要的功能:统一API。有时候一个数据库不仅仅就一个应用在操作,例如一个系统,它有web平台(Java),也有本地的CS平台(.NET)。这个时候就可以使用SP统一API。

当然,这种情景,你甚至可以用上一些中间件,例如ICE之类的。

SP有一个比较明显的缺点:部署的时候的版本控制比较麻烦。
1 请登录后投票
   发表时间:2011-01-19  
魔力猫咪 写道
为什么这么多人都认为Java代码不如存储过程好调试测试呢?单元测试和断点调试怎么着都是Java代码好调呀。

有时候单元测试调不鸟的时候,你不得不启动一个容器,更有的系统代码是依赖于某个容器自身代码的实现,比如weblogic之类的,让它慢慢启动吧,它再会自动加载,也会有死一次的时候
0 请登录后投票
   发表时间:2011-01-19  
老生常谈了 以前我也跟LZ一样困惑,但想来LZ是没有弄过多机存储吧,或者说sharding,缓存这些。真用到了,你就会觉得存储过程相当无力
0 请登录后投票
   发表时间:2011-01-19  
glovebx 写道

好吧,我承认没看过说明,一直以来都当他是免费的,至少5.5以下还是免费的吧?
自动的单元测试没做过:),白盒+黑盒测试过了,再有就是用户边用边改。
BUG不多,主要是数据计算错误--涉及的表比较多不小心就漏了,或者漏了个字段。


是否免费和版本没有关系。我记得好像是开源软件或者运营的网站是免费的,闭源的商业软件是要收费的,而且价格不菲。很多开发人员误认为MySQL是无条件免费的了。

没有单元测试,边用边改,回归测试能累死你,否则会改了一个问题又带出n个,除非你的业务很简单。目前我们有一个项目就陷入越改问题越多的困境。
0 请登录后投票
   发表时间:2011-01-20  
liangguanhui 写道
xiaoshan5634 写道
使用存储过程的优点:
1.开发速度非常快,基本上一个增删改查一个小时就能搞定
2.可以实时的更新业务逻辑代码不需要重新编译java代码,对于业务逻辑经常变的系统这点很有帮助
缺点:
1.数据量大时,对数据库的压力就非常大
2.对于热门资源访问量较大,容易形成堵塞,若存储过程写的不好,容易产生死锁。web层可以很容易无限的横向扩展,但数据库就只有一个,一但数据库堵塞了,整个系统也就差不多要挂掉了。使用存储过程会增加数据库服务器的负担。

我们公司就是将业务都写在存储过程里,现在经常都会堵塞,快要下班时系统就很慢。我们想了很多办法,将使用非常频繁且对数据库有压力的查询使用Lucene来完成。页面静态化,减少用户对数据库的访问。现在数据库的压力还是无法释放,正考虑换sql server2008,能将数据库的内存加到12G,可以缓解一点数据库的压力。


+1

其实SP还有一个很重要的功能:统一API。有时候一个数据库不仅仅就一个应用在操作,例如一个系统,它有web平台(Java),也有本地的CS平台(.NET)。这个时候就可以使用SP统一API。

当然,这种情景,你甚至可以用上一些中间件,例如ICE之类的。

SP有一个比较明显的缺点:部署的时候的版本控制比较麻烦。

完全同意你的观点,版本控制确实比较麻烦,现在我们是每次修改完成的时候都保存为文件,然后将其上传都SVN,这样就人为的做到了版本控制。
0 请登录后投票
   发表时间:2011-01-20  
glovebx 写道
xiaoshan5634 写道
glovebx 写道
xiaoshan5634 写道
比如说customer表,我们有一个功能使用的非常频繁,这个功能有20来个查询条件,而且还有需要使用对大字段使用like,当然like部分已经用Lucene实现了。都放入缓存中,可是需要查询customer表中的记录怎么办呢?
查询字段:客户编码,关键字1,关键字2,电话号码,邮件地址,手机号码,区号,客户地址还有很多字段为查询条件。


读写分离,为此部分查询提供只读数据。这样主系统的压力就会减小。
客户编码等这些检索字段,尽可能短,尽量固定长度(比如用char类型),建索引。Lucene不是很熟,但是我看过有人用Sphinx结合mysql做的全文搜索,看上去性能不错。

开会了,回头继续探讨。

Sphinx结合mysql做全文搜索,建索引的速度比Lucene快很多,但他只支持utf-8,了对中文的支持不是很好,它还有一个弊端就是一定要跟mysql结合使用,现在我们使用db4o+Lucene,而主数据库用sql server。Sphinx一定要结合mysql,所以要换的话还是由点麻烦的。


你们是sql server,那就没办法了。
换数据库也不现实。

这么多条件的查询,有没有什么好的缓存解决方案?谁有过经验的给介绍介绍

是啊。。 有好的缓存解决方案请给介绍介绍,有好的经验解决这种问题也请介绍介绍。 
0 请登录后投票
   发表时间:2011-01-20  
把业务逻辑写到存储过程,是种很不好的实现方式。因为一般随着业务的增大,逻辑的复杂,性能会逐渐下降,后面你会发现MySQL已经无法满足你的需求,得换Oracle或者SQLServer, 或者做一些迁移,集群之类的,一般需要改变的都是数据库,而不是前端或者服务器Java代码,这样你那些写在数据库里面的东西都得改,数据库写的越多,工作量越大。
0 请登录后投票
   发表时间:2011-01-20   最后修改:2011-01-20
sniffer123 写道
老生常谈了 以前我也跟LZ一样困惑,但想来LZ是没有弄过多机存储吧,或者说sharding,缓存这些。真用到了,你就会觉得存储过程相当无力


sharding并非任何时候都需要考虑,缓存我们现在就有。
如果仅关注一个点,说存储过程相当无力,没有说服力。

我们现在的方案,某些数据如果有更新,在存储过程里通过udf将json格式的数据直接写入tokyo cabinet的缓存里。前台取数据的时候先看缓存,没有则从数据库取。
0 请登录后投票
   发表时间:2011-01-20   最后修改:2011-01-20
seya 写道
把业务逻辑写到存储过程,是种很不好的实现方式。因为一般随着业务的增大,逻辑的复杂,性能会逐渐下降,后面你会发现MySQL已经无法满足你的需求,得换Oracle或者SQLServer, 或者做一些迁移,集群之类的,一般需要改变的都是数据库,而不是前端或者服务器Java代码,这样你那些写在数据库里面的东西都得改,数据库写的越多,工作量越大。


写在代码里,同样会有“一般随着业务的增大,逻辑的复杂,性能会逐渐下降”的问题。
我不觉得SQLServer的性能强过mysql,mysql支撑千万级的海量数据一点问题都没有。

另外,选型的时候这些都考虑过,就进销存而言,mysql足够了,不存在换数据库问题。
换数据库带来的修改工作量确实非常大,所以任何项目技术选型要慎重。

另外,如果业务逻辑都在java代码里,那么后面如果有业务变更--特别流程变更时,你会发现改代码成了噩梦,牵一发而动全身。sp对付这样的修改就容易得多--个人经验谈。
0 请登录后投票
   发表时间:2011-01-20  


这个问题很简单-----------------答案是:绝对不能用
0 请登录后投票
论坛首页 综合技术版

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