楼主: fan0124

[SQL] 【讨论】关于数据层用不用存储过程封装的问题?

[复制链接]
论坛徽章:
26
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24夏利
日期:2013-08-13 23:25:29优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11蓝色妖姬
日期:2015-03-19 09:37:00ITPUB年度最佳技术原创精华奖
日期:2015-03-19 09:43:24
41#
发表于 2010-9-20 22:28 | 只看该作者
原帖由 xjg 于 2010-9-20 11:30 发表
如果是企业级应用,都没有问题,大家都用存储过程吧,好维护,方便修改

但如果是大并发的WEB应用,很快你就会发现,所有的瓶颈都集中到了数据库服务器上面。

我估计这也是为什么TAOBAO、EBay很少会用存储过程。对他们来说,数据库只是用来持久化的,业务逻辑什么的,都在应用层实现。
只有这样分层,横向扩展才有可能,毕竟DB要横向扩展个几百几千台机器不大可能吧?




呵呵,这个我不太赞同.  不管你做什么业务操作,总要修改或查询数据库吧;

所以,你做任何操作,都要涉及的数据库的SQL;


就像你说的,“ 如果是大并发的WEB应用”,那么不用存储过程,你用什么呢?

你用在所谓的中间层的服务器上,用java或其他语言,拼接大量的SQL字符串,然后发送到DB执行,难道这样就可以让中间层服务器分担DB服务器的压力吗?
我觉得这样两个服务器都更累;


也许我的看法不对,也许中间层能够缓存数据,表现层的查询数据可以不通过数据库,直接在中间层缓存里得到;
但是我觉得这个不太现实,你怎么知道中间层内存缓存的数据时最新的呢?万一发生变化呢?莫非做一个中间层和DB的数据同步机制;
这就相当于中间层服务器模拟了数据库SGA的data buffer 的功能; 这个起来应该很复杂吧?还有稳定吗?

就算做到 中间层服务器 能否 分担数据库的查询压力;

但是那么多update ,中间层也能分担吗? 也许中间层会集中多个SQL,一起提交(或者自动选择最佳的时间,在DB端最不累的时候提交); 避免了一个一个SQL不固定的单独提交? 但是这样能降低db的压力吗?能实时吗?能稳定吗?


我一直理解的中间层服务器,说白了对数据库降低压力的地方,就是能做好连接池;

[ 本帖最后由 qingyun 于 2010-9-20 22:36 编辑 ]

使用道具 举报

回复
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51茶鸡蛋
日期:2011-12-29 10:46:33迷宫蛋
日期:2011-12-29 16:24:482012新春纪念徽章
日期:2012-01-04 11:54:46紫蛋头
日期:2012-02-21 21:27:43
42#
发表于 2012-3-9 11:30 | 只看该作者
拒绝二流 发表于 2010-8-8 22:40
我不晓得 ebay 或 taobao 的技术会有多先进。。。
我们的应用都是这种架构  htm/jspweb server(java sql语 ...

这个跟我们做的一样,SQL基本在xml中拼接,然后调用。

使用道具 举报

回复
论坛徽章:
0
43#
发表于 2012-7-20 13:15 | 只看该作者
呵呵,学习了!

使用道具 举报

回复
论坛徽章:
0
44#
发表于 2012-7-20 14:06 | 只看该作者
顶顶啊

www.ball002.com
www.ball005.com
www.ball008.com
www.ball009.com

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
45#
发表于 2012-7-20 14:38 | 只看该作者
newdelete 发表于 2010-9-20 17:12
我们的标准跟你们cto一样,简单的sql,直接通过中间件包装进库,涉及大量业务处理或者大数据量的,用过程。 ...

极其复杂的业务逻辑不用存储过程。
而是使用交易中间件。

使用道具 举报

回复
论坛徽章:
0
46#
发表于 2012-7-20 15:37 | 只看该作者
HIBERNATE中的SQL通常都是字符串拼接的形式出现在代码中,IBATIS的SQL则是在配置文件中,而如果用ORACLE ADF就不用考虑SQL放哪里了。所以,这个SQL放哪里,是不是跟所使用的技术有关系呢?

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
47#
发表于 2012-7-22 11:30 | 只看该作者
本帖最后由 yulihua49 于 2012-7-22 11:31 编辑
newkid 发表于 2010-7-29 21:54
不管你系统分几层,和数据处理相关的逻辑就应该在数据库里完成。


我不反对你的观点,但是要前缀“一般说”。
另外,“应该在数据库里完成”,不见得在存储过程。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
48#
发表于 2012-7-22 11:38 | 只看该作者
本帖最后由 yulihua49 于 2012-7-22 12:03 编辑
lsmnlsmn 发表于 2012-7-20 15:37
HIBERNATE中的SQL通常都是字符串拼接的形式出现在代码中,IBATIS的SQL则是在配置文件中,而如果用ORACLE AD ...


即使现拼接SQL,我们可以做到生成一次语句,打开一次游标,使用1000000次。而且分摊到N个前端线程,组织语句和解析开销都可以忽略不计。

前端有N个服务器,每个服务器有M个线程,每个线程每次接受1000个记录,处理后批量插入数据库。
处理过程:需要反复查询的字典表和基础数据表加载到内存,使用K-V机制进行内存查找,
对于每个记录,得到N个方案,评估出一个最终方案,这样处理一个记录。
这种并行操作,存储过程还不如前端SQL快。
后续处理采用存储过程。

所以,我的观点,用不用存储过程,根据需要,不能规定一律用或一律不用。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
49#
发表于 2012-7-23 03:09 | 只看该作者
yulihua49 发表于 2012-7-22 11:38
即使现拼接SQL,我们可以做到生成一次语句,打开一次游标,使用1000000次。而且分摊到N个前端线程,组织 ...

几年过去了你还在搞这个批量插入做例子,有点新意行不行啊?
我的答复还像几年前一样:用外部表,可以INSERT SELECT, 可以MERGE, 可以直接路径加载,可以并行。
我才不会用存储过程去解析文件。
你那个游标缓存也是PLSQL玩剩下的。不过你从一开始拒绝使用绑定变量到现在用游标缓存,已经进步很大了。

使用道具 举报

回复
论坛徽章:
0
50#
发表于 2012-7-23 13:55 | 只看该作者
yulihua49 发表于 2012-7-22 11:38
即使现拼接SQL,我们可以做到生成一次语句,打开一次游标,使用1000000次。而且分摊到N个前端线程,组织 ...

受教受教。。。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表