楼主: yulihua49

[PRO*C] 看我做的数据库包装器

[复制链接]
论坛徽章:
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
61#
 楼主| 发表于 2008-12-5 17:14 | 只看该作者
单线程比多线程快?搞不好并发??多进程很快?多进程占用资源多还是多线程占用资源多啊?

资源跟速度没有关系。多线程的时间是在互斥中度过的。说到这,你应该明白了。还有,UNIX与WINDOWS很不同的,进程开销很小。C与JAVA不同,进程开销很小。这个事实决定了,TUXEDO使用多进程技术。
资源使用多的问题可以增加配置来解决。中间件服务器可以使用内存大、主频高,多核多CPU的Intel刀片服务器,很便宜的。
而数据库用高级的小型机、大型机的RAC服务器。
这个架构可以看出,中间件服务器多几条指令,多用点内存不算什么。但是让昂贵的数据库服务器进行数学计算是不合算的,完成高可用的、高吞吐量的数据存取才是正业。
所以,我们的构架分工明确,不用存储过程,避免数据库服务器过大压力,让它能够为更多的客户提供更迅捷的数据存储服务,让中间件服务器承担更多的计算任务是合理的。

[ 本帖最后由 yulihua49 于 2008-12-5 17:37 编辑 ]

使用道具 举报

回复
论坛徽章:
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
62#
 楼主| 发表于 2008-12-5 17:46 | 只看该作者
原帖由 zhangfengh 于 2008-12-5 17:00 发表


还用ULTRAEDIT文本编辑器,有个写字本足矣

我说的高效编程与你们并无矛盾。完全可以使用任何编程工具。
我的高效编程指:应用程序员不用整天看着数据库表结构,一个一个字段的去描SQL语句。他只要把有关的字段处理好就行。就像前边的程序,只有3.4个字段与此业务有关,其它十几个字段,再增加些或减少些与此程序无关。

使用道具 举报

回复
论坛徽章:
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
63#
发表于 2008-12-5 23:30 | 只看该作者
原帖由 yulihua49 于 2008-12-5 17:14 发表
资源使用多的问题可以增加配置来解决。中间件服务器可以使用内存大、主频高,多核多CPU的Intel刀片服务器,很便宜的。
而数据库用高级的小型机、大型机的RAC服务器。
这个架构可以看出,中间件服务器多几条指令,多用点内存不算什么。但是让昂贵的数据库服务器进行数学计算是不合算的,完成高可用的、高吞吐量的数据存取才是正业。
所以,我们的构架分工明确,不用存储过程,避免数据库服务器过大压力,让它能够为更多的客户提供更迅捷的数据存储服务,让中间件服务器承担更多的计算任务是合理的。


为啥数据库就不能用便宜的intel服务器作集群?

你不用存储过程,但是给数据服务器的压力一点也没有减少,反而更大,因为本来一次数据库交互(存储过程调用)变成了多条SQL。

有什么“数学计算”是在数据库之外进行更合算的?举个例子!

我先来一个例子:假如你有10万个员工,求工资总额,让数据库求和就是一个在10万行记录上的SUM。你也可以把这10万行取到你的应用服务器去求和。你觉得哪个更合算?哪个对数据库负担更重?

你在WHERE中不使用绑定变量,那才是真正的CPU杀手!

别忘了我的挑战书,我等着你给我出题呢。

使用道具 举报

回复
论坛徽章:
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
64#
发表于 2008-12-5 23:33 | 只看该作者
原帖由 yulihua49 于 2008-12-5 17:46 发表

我的高效编程指:应用程序员不用整天看着数据库表结构,一个一个字段的去描SQL语句。他只要把有关的字段处理好就行。就像前边的程序,只有3.4个字段与此业务有关,其它十几个字段,再增加些或减少些与此程序无关。


我如果有个存储过程只使用了某张表的某些列,我也只要把这些写出来就行了。其他字段也与此模块无关。你用C程序不也是要访问这些字段吗?怎么就比写个SQL方便了?

使用道具 举报

回复
论坛徽章:
27
ITPUB元老
日期:2008-11-04 00:24:49奥运会纪念徽章:足球
日期:2012-07-11 17:05:242011新春纪念徽章
日期:2011-02-18 11:42:50NBA常规赛纪念章
日期:2010-04-15 14:01:102010年世界杯参赛球队:瑞士
日期:2010-04-02 01:00:092010年世界杯参赛球队:喀麦隆
日期:2010-03-06 23:38:02菠菜明灯
日期:2009-11-16 10:02:37IT宝贝
日期:2009-08-19 13:48:24季节之章:冬
日期:2009-08-03 09:58:34季节之章:秋
日期:2009-08-03 09:58:28
65#
发表于 2008-12-5 23:57 | 只看该作者
一群技术牛人

使用道具 举报

回复
论坛徽章:
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
66#
 楼主| 发表于 2008-12-6 16:10 | 只看该作者
原帖由 newkid 于 2008-12-5 23:33 发表


我如果有个存储过程只使用了某张表的某些列,我也只要把这些写出来就行了。其他字段也与此模块无关。你用C程序不也是要访问这些字段吗?怎么就比写个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
67#
 楼主| 发表于 2008-12-6 16:18 | 只看该作者
原帖由 newkid 于 2008-12-5 23:30 发表


为啥数据库就不能用便宜的intel服务器作集群?

你不用存储过程,但是给数据服务器的压力一点也没有减少,反而更大,因为本来一次数据库交互(存储过程调用)变成了多条SQL。

有什么“数学计算”是在数据库之外进行更合算的?举个例子!

我先来一个例子:假如你有10万个员工,求工资总额,让数据库求和就是一个在10万行记录上的SUM。你也可以把这10万行取到你的应用服务器去求和。你觉得哪个更合算?哪个对数据库负担更重?


你在WHERE中不使用绑定变量,那才是真正的CPU杀手!

别忘了我的挑战书,我等着你给我出题呢。

你尽可以写sum函数啊,我的包装器没有禁止你写复杂的SQL语句,在列名里可以sum、avg、total。。。。order by   ,group by
随便啊。看我前边的例子,decode我都写了,sum不是一样嘛。
T_PkgType sum_type[]={
            {CH_DOUBLE,sizeof(double),"sum(ccc) sum",0,-1},
            {-1,0,0,0}
};
int ret;
double sum;
DAU sum_DAU;
char stmt[2048];

             DAU_init(&sum_DAU,SQL_Connect,"tabname",&sum,sum_type);
             sprintf(stmt,"where aaa='%s' and bbb=%d",value_for_aaa,value_for_bbb);
             ret=DAU_select(&sum_DAU,stmt,1);
              DAU_next(&sum_DAU);
            DAU_free(&sum_DAU);
            printf("sum=%f\n",sum);
.........
看来简单语句优越性不大。虽然存储过程写起来比这简单,但我要调用它并bind返回值,语句会比这多,更主要的,程序员必须理解其中的机制,我这程序概念很少。


看了ORACLE的语句池,用常数完全可以的,它要求严格相等的语句,我完全满足这个要求。如果两个客户先后请求了同样的内容,语句分析完全可以绕过。语句生成开销几乎为0,不必考虑。

领导对小型机的印象已经根深蒂固,轻易不会改变。再说,小型机可以买到服务,一年只要花几百万,系统出什么事,人家立刻派技术人员现场处理,全部责任由厂家负,我们领导就没责任啦!

整个架构方案与ORACLE密切协商的结果,ORACLE承认OCI是最高效的接口,存储过程可能在特定条件下更有效。

新的DAU支持存储过程,但对存储过程还是要慎用。
使用方法:
调用存储过程,bind返回参数,如果有游标 则:
DAU_init(&_DAU,SQL_Connect,0,&struct,_type);//struct和_type要保证和存储过程里的SQL语句一致。
_DAU.cursor=返回的游标。

后边的处理都一样了。
至于具体业务,就看程序员认为哪个方便了。

压力测试比较复杂,已经在PRO*C测过,能够满足需求。这套系统的性能与PRO*C基本一样。
下周给你个功能,你试试吧。我主要怀疑你的存储过程万能论。

性能方面,我相信,如果数据结构设计合理,各种方式差不多。现有的DEMO已经表现了优异的性能。
我一直强调的是,本方法编程便捷。就像hibernate,尽管对它的性能有不少质疑,仍获得广泛使用。


有什么“数学计算”是在数据库之外进行更合算的?举个例子!
这不需要考虑,几乎所有的数学计算,C语言都要比存储过程快数量级的。以主频2.5G的CPU为例,一条指令仅0.4毫微秒,即每微秒2500条指令,C语言的语句对机器指令有限对应(一个语句对应有限条机器指令)。存储过程(我知道ORACLE可以使用C库,但我指的一般的存储过程)是半编译的,即使简单表达式,内部也具有复杂结构。计算速度能超过C的,只有汇编了。
小型机的主频一般不高,远比INTEL CPU低,造价又那么高,当然不合算。

认证加解密、压缩、格式变换(变量-JSON-字符串)、动态计算方法(比如票价计算,算法随时由业主提出,可能要用一些描述字典来表达),链表,树,图(径路计算)等,哪样存储过程也玩不转。

[ 本帖最后由 yulihua49 于 2008-12-6 19:07 编辑 ]

使用道具 举报

回复
论坛徽章:
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
68#
发表于 2008-12-7 05:58 | 只看该作者
"还是以我那个程序为例,虽然这里只用到四个字段,但全部字段都是要提取出来送到客户端的,即使有任何变化,都要保证是最新的。"
你的意思是某个模块取得整行数据但只使用其中几个列,再传给其他模块?
PLSQL的思路和这个没有可比性,我很少这样传递数据,但如果实在要这么干,用%ROWTYPE作参数就完全可以实现。


"你尽可以写sum函数啊,我的包装器没有禁止你写复杂的SQL语句,..."
我是顺着你的思路,把“计算”任务从数据库分离出来到应用服务器完成,当然我也不相信你会把SUM移出来,就是一个例子。我就是要说明试图把“计算”拿出来是不可取的,反而会给数据库造成更大负担。

"虽然存储过程写起来比这简单,但我要调用它并bind返回值,语句会比这多,更主要的,程序员必须理解其中的机制,我这程序概念很少。"
我不觉得调用一个过程的机制会有多么复杂,有什么难理解的?不就是个接口吗?


"看了ORACLE的语句池,用常数完全可以的,它要求严格相等的语句,我完全满足这个要求。如果两个客户先后请求了同样的内容,语句分析完全可以绕过。语句生成开销几乎为0,不必考虑。"
你错了。看看你自己的例子:始发日期、车次、上车站、下车站、席别、用途、数量
知道这里面所有字段的所有取值会有多少种组合?两个客户买同一种票的可能性占的比例是多少?而且始发日期每天都不一样!本来一个硬解析可以搞定,你却生成了N种SQL!这样的做法不单浪费CPU,有时候还把优化好的计划给挤出去了,因为再大的共享池也满足不了你。


"领导对小型机的印象已经根深蒂固,轻易不会改变。再说,小型机可以买到服务,一年只要花几百万,系统出什么事,人家立刻派技术人员现场处理,全部责任由厂家负,我们领导就没责任啦!"
既然投资了就要让小型机发挥计算能力,不要把它当作存储设备。

"整个架构方案与ORACLE密切协商的结果,ORACLE承认OCI是最高效的接口,存储过程可能在特定条件下更有效。"
是与ODBC,JDBC相比较吧?
ORACLE销售人员为了卖出单子,肯定会顺着你们的思路,这个我一点都不奇怪。

"新的DAU支持存储过程,但对存储过程还是要慎用。
使用方法:
调用存储过程,bind返回参数,如果有游标 则:..."
太好了,我们可以利用这个功能作对照测试。


"下周给你个功能,你试试吧。我主要怀疑你的存储过程万能论。"
我建议你把你认为最可能发生“堵车”的部分拿出来,我来证明存储过程是如何的顺畅。
我从来没有说过存储过程万能,但存储过程对付密集型事务系统是最佳方案。

“我一直强调的是,本方法编程便捷。就像hibernate,尽管对它的性能有不少质疑,仍获得广泛使用。”
便捷与否,看编程人员的熟练程度。在我看来用文本编辑器写存储过程就很便捷。


"这不需要考虑,几乎所有的数学计算,C语言都要比存储过程快数量级的。以主频2.5G的CPU为例,一条指令仅0.4毫微秒,即每微秒2500条指令,C语言的语句对机器指令有限对应(一个语句对应有限条机器指令)。存储过程(我知道ORACLE可以使用C库,但我指的一般的存储过程)是半编译的,即使简单表达式,内部也具有复杂结构。计算速度能超过C的,只有汇编了。
小型机的主频一般不高,远比INTEL CPU低,造价又那么高,当然不合算。"
存储过程不和C程序拼算法,比的是处理事务的能力。存储过程大量依靠SQL, 你再怎么搞,最终也得生成SQL, 这是绕不过去的。


认证加解密: 去看看DBMS_CRYPTO,里面应有尽有,都是用C实现的。批量数据的加密解密肯定是用SQL调用DBMS_CRYPTO最快,比你一行一行取出来再运算再写回数据库要快。
压缩: 这主要在图像视频处理领域,不是我讲的事务处理。
格式变换(变量-JSON-字符串): 我说过要在数据库之外完成。非得让数据库来做,效率也不低,就是代码看起来比较“脏”。
动态计算方法(比如票价计算,算法随时由业主提出,可能要用一些描述字典来表达): 这绝对是存储过程占优,不信你就和我比试比试。规则(参数)都是存在数据库里的。

链表,树,图(径路计算)等:我很少用链表,事务处理数组足矣。至于树和图,这正是ORACLE的CONNECT BY大显身手的地方,特别是数据越大优势越明显。
看看我出这个题:
http://www.itpub.net/thread-1037629-1-1.html

“哪样存储过程也玩不转”
你错了!

[ 本帖最后由 newkid 于 2008-12-7 06:07 编辑 ]

使用道具 举报

回复
论坛徽章:
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
69#
发表于 2008-12-7 22:06 | 只看该作者
说到树的遍历,给你出个题:
http://www.itpub.net/thread-1095473-1-2.html

作者的数据在ETL过程中失去了父子关系,我用SQL重新建立了父子关系,并求出所有根到节点的用量合计。
你用你的方法做做看,把数据弄到C服务器里去遍历、计算,看看效率怎么样?

现在的数据量太少,SQL优势不明显,如果你有兴趣应战我可以提供SQL脚本来灌入几万行数据。

使用道具 举报

回复
论坛徽章:
556
70#
发表于 2008-12-7 22:19 | 只看该作者
牛人  支持下

使用道具 举报

回复

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

本版积分规则 发表回复

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