楼主: 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
351#
 楼主| 发表于 2009-6-26 11:23 | 只看该作者
原帖由 newkid 于 2009-6-25 04:07 发表

你有没有想过这个“逐个记录提取”的方法给数据库造成了额外的负担?你那点计算根本微不足道,别小看了SQL的计算能力。


用压力测试跑过我的存储过程吗?


11G支持对连接结果的CACHE.
但这和绑定变量有什么关系?不论你是单表查询,多表连接查询,SQL的解析原理都是一样的。你把数据缓冲区和共享池搞混了,回头好好复习ORACLE的体系结构。

回来了哈,欢迎欢迎!
11G是个好消息,如果是,我可能会改进我的软件支持之。
实践证明我的方案数据库服务器的负载非常轻。
2000个客户端同时抢票,这已经是一个大铁路局的负荷量了。10个TUXEDO服务进程活动起来,历时12.8秒。
瞬间CPU利用率达到60%,12个ORACLE进程CPU使用在1%-5%不等。
应用服务器CPU达到60%,WSH和kpsrv进程轮流上场,每个进程在7%-8%。看到了应用服务器和数据库服务器分担负荷。

你的存储过程我编译过不去,我还以为找不到你了呢,这事就放下了。
找了个小伙子看了你的存储过程,据说是看懂了,他老是忙,没跟他仔细弄这事。

最近做了一个吧TUXEDO与数据库分开的试验,说明一定问题。

使用了一个双核32位的PC机。10个TUXEDO 服务进程。

每次申请2个席位,包含登录、查询车次、席位申请,没有申请到席位。单个任务运行时间比较慢:
客户端数:                   在数据库一起的64位服务:               分开的32位服务:
1                                              0.06秒                                  0.11秒
1000                                        7.8秒                                     6.1秒

单个的时间长了,多请求时间短了,体现了一定的并行性。如果没有这个并行,应该15秒左右。有3个不同性质的过程在并行:
数据存取(在数据库服务器)、数据传输(在两个网络,中间服务器对数据库,对客户端)、数据处理(中间服务器)。

ORACLE的客户端是否也有一定的buffer能力呢?如果是,中间服务器访问数据库的量还可以少,不过我看结论可能是否定的。
我不怀疑PL/SQL的能力,但是:
一个数据库服务器的吞吐量是有限的,现在只让他干一点点存取的事,它就有时间为很多很多中间服务器工作,系统总吞吐量大增。
我们可以用很多中间服务器,让业务逻辑尽可能在此进行,这是总方针。

[ 本帖最后由 yulihua49 于 2009-6-26 16:40 编辑 ]

使用道具 举报

回复
论坛徽章:
15
生肖徽章:龙
日期:2007-06-05 12:28:05生肖徽章:龙
日期:2007-06-05 21:25:11生肖徽章:龙
日期:2007-06-09 22:24:422010新春纪念徽章
日期:2010-03-01 11:06:13
352#
发表于 2009-6-26 20:47 | 只看该作者
学习了...

使用道具 举报

回复
论坛徽章:
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
353#
发表于 2009-6-26 22:35 | 只看该作者
原帖由 qingyun 于 2009-6-26 10:54 发表
我一直很崇拜 newkid 兄, 不知道您除了oracle开发上比较“猛”外,在oracle 管理上是否很全面;
还有除了Oracle,其他技能,比如:Java,Spring+Struts2+HiberNate 等方面有很厉害;
我想java web方面猛的话,选择面还是挺宽的;

不过,加拿大福利那么好;就算呆在家里,生活也不成问题吧;


DBA知识多少懂一些,但我一直觉得比较枯燥,没有深入研究,做做日常维护也是没有问题的。JAVA只略懂个皮毛,不足以去应付高级职位。JAVA的东西更新太快,一个挺新潮的框架过一会儿功夫可能就不流行了,这也是我无法投入学习的原因。看来以后为了防身得学着点。
靠着失业救济金和自己的积蓄,再撑个一年没问题。但是整天郁闷,对健康也不利,所以还是得找个工作。

使用道具 举报

回复
论坛徽章:
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
354#
发表于 2009-6-26 22:41 | 只看该作者
11G是个好消息,如果是,我可能会改进我的软件支持之。

CACHE对应用开发是透明的, 如果你要改自己的软件,你的任务就是写好SQL, 大胆地用JOIN! 千万别再自己搞什么嵌套循环,这个道理在11G以前版本也适用。

你的存储过程我编译过不去,我还以为找不到你了呢,这事就放下了。

几楼的程序?你现在的表结构是怎样的?我会给你一个可编译版本的。
这个抢票动作,不管你放在C还是放在PLSQL, 数据库负担都差不多。等你试过我的存储过程就知道了。

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
355#
发表于 2009-6-26 23:23 | 只看该作者
如果能开发出来万能的中间件,突然感觉好有压力呀,学习数据库的信心都没有了。

使用道具 举报

回复
论坛徽章:
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
356#
 楼主| 发表于 2009-6-28 10:28 | 只看该作者
原帖由 newkid 于 2009-6-26 22:41 发表

CACHE对应用开发是透明的, 如果你要改自己的软件,你的任务就是写好SQL, 大胆地用JOIN! 千万别再自己搞什么嵌套循环,这个道理在11G以前版本也适用。


几楼的程序?你现在的表结构是怎样的?我会给你一个可编译版本的。
这个抢票动作,不管你放在C还是放在PLSQL, 数据库负担都差不多。等你试过我的存储过程就知道了。

具体情况明天上班再给你。

跟你交往几个月,学习不少东西,看了这个坛子,SQL真是无比神奇,无论ORACLE还是mysql。
性能问题,我认为你我两个方案并无本质差别。关键是使用的条件。在集总的系统里二者差不多。在分布的系统里,我可能优势多一些。
上面的试验,非常粗糙,很多设置和功能分布未必合理。正在进一步研究TUXEDO的集群系统,没有很好的配置条件,很多情况使用虚拟机,效果打折扣,只能做定性的研究。

本坛不少为求一个SQL,耗时数天的。我想对于我们一群菜鸟伙计,无法要求他们短期内精通SQL,也不可能经常写半截程序到坛子上等讨论结果。与其死等一个语句,不如用多条语句+程序逻辑先把问题解决了,以后在琢磨怎么优化。毕竟按时完成任务是最重要的。

我致力于做一点简单的工具,让入门级程序员尽快进入状态,性能很重要,至少不能太差,这点到现在算是成功了。
你的意见我十分尊重,如果我有一个资深SQL程序员,我会让他写DAO层,写出各种精妙语句。我也许会改进DAU配合各类语句,要么就为这些特殊语句写模板。在我的系统里,虽然大部分模板可以自动生成,但精致的语句还是需要精致的模板,写这种模板也是挺有技巧的,就像前边自动生成模板的模板。

楼上的朋友说的是我吗?还是我们的未来?
首先,我这个东西达不到中间件的水平,它是中间件系统里的一个工具。其次目前达不到万能,我一直强调20-80法则,就是大部分工作利用工具,实在不行就手工。要想有点出息还是要精通SQL,这对用好工具,改进工具十分有必要。

技术上不要受惯性思维的束缚,精通SQL的,也别老想着一条SQL语句包打天下,我这类的,也别想着一条记录包打天下。

[ 本帖最后由 yulihua49 于 2009-6-28 11:06 编辑 ]

使用道具 举报

回复
论坛徽章:
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
357#
发表于 2009-6-29 00:15 | 只看该作者
"本坛不少为求一个SQL,耗时数天的。"
这不就是当程序员的乐趣吗?
我在工作中很少有这种乐趣,一切都是那么轻车熟路,一旦需求领会了几分钟就可以写出SQL. 如果数据结构设计得好,那些精妙的SQL很少用得上。
SQL也是代码,但它和过程性代码不同。里面没有判断、分支,一切都写在连接和过滤条件里去了。这就大大减轻了调试、优化的负担。
你去看看一个SQL生成的计划,里面就是一段程序。(如果CBO用了NESTED LOOP, 就几乎和你的程序一模一样)
但是现在你不必自己写这段程序,SQL引擎替你写好了。这难道不是很奇妙?

使用道具 举报

回复
论坛徽章:
0
358#
发表于 2009-6-29 09:08 | 只看该作者
原帖由 newkid 于 2009-6-29 00:15 发表
"本坛不少为求一个SQL,耗时数天的。"
这不就是当程序员的乐趣吗?
我在工作中很少有这种乐趣,一切都是那么轻车熟路,一旦需求领会了几分钟就可以写出SQL. 如果数据结构设计得好,那些精妙的SQL很少用得上。
SQL也是代码,但它和过程性代码不同。里面没有判断、分支,一切都写在连接和过滤条件里去了。这就大大减轻了调试、优化的负担。
你去看看一个SQL生成的计划,里面就是一段程序。(如果CBO用了NESTED LOOP, 就几乎和你的程序一模一样)
但是现在你不必自己写这段程序,SQL引擎替你写好了。这难道不是很奇妙?

能够写一个程序,生成各种各样的SQL语句,不也是一种乐趣吗?不过我还到不了这个境界。
你这样的高手,可遇不可求,我们上哪找去?

说实在的,你那段代码我没看懂。如果我懂了,理解了,用包装器完全可以实现,代码还可以精简许多。

我的席位发布,几经改进,发布22556个席位只需5秒多一点。你想追上也不是很容易哦!

tuxticket@jgbticket:~/test> time xwfbDAU -f ../config/xw.ini -D+2

real    0m5.204s
user    0m0.848s
sys     0m0.420s

5 xwfbDAU:28016 06/29 09:20'03 bind_ins:sth=4,stmt=INSERT INTO TICKET.SEAT (start_date,beg_station,train_no,run_train,on_date,carno,seat_type,seat_no,end_station,shortest_station,purpose,gride,pro,flag,used_dev,used_uid,used_time) VALUES (to_date(:1,'YYYY-MM-DD'), :2, :3, :4,to_date(:5,'YYYY-MM-DD HH24:MI'), :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16,to_date(:17,'YYYY-MM-DD HH24:MI:SS'))
2 xwfbDAU:28016 06/29 09:20'03 mkxw train=2009-07-11:C2280,beg_station=TGP,end_station=2,carno=1,remant=1205 xwfbDAU:28016 06/29 09:20'03 bind_prepare:cursor=5,SELECT  to_char(on_date,'YYYY-MM-DD') on_date,beg_station,run_train,carno,seat_type,purpose,end_station,amoung FROM TICKET.SEAT_REMANT WHERE on_date=to_date(:1,'YYYY-MM-DD') AND beg_station=:2 AND run_train=:3 AND carno=:4 AND seat_type=:5 AND purpose=:6 AND end_station=:7 for update5 xwfbDAU:28016 06/29 09:20'03 bind_ins:sth=6,stmt=INSERT INTO TICKET.SEAT_REMANT (on_date,beg_station,run_train,carno,seat_type,purpose,end_station,amoung) VALUES (to_date(:1,'YYYY-MM-DD'), :2, :3, :4, :5, :6, :7, :8)
2 xwfbDAU:28016 06/29 09:20'04 totalnum=22556



  1. CREATE GLOBAL TEMPORARY TABLE seat_parameter (    -- 参数表
  2.           dflg           NUMBER(1)    -- 控制JOBDAY的计算
  3.          ,start_date     DATE         -- today
  4.          ,end_date       DATE         -- 如果非空,则可以生成多天的数据
  5.          ,train_no       VARCHAR2(12) -- 如果为0或NULL则忽略
  6.           ) ON COMMIT DELETE ROWS
  7. /

  8. -- 把两个复杂查询抽出来建立视图:
  9. CREATE OR REPLACE VIEW vw_train
  10. AS  ------ 无号和普通都用到的一些变换计算和公共子查询(车次和停靠站的选取)
  11. SELECT t.train_no
  12.       ,t.gride
  13.       ,t.station_num
  14.       ,t.jobday
  15.       ,t.item
  16.       ,cz.station_code                                           AS beg_station
  17.       ,t.jobday+(t.start_time+cz.running_time+cz.stop_time)/1440 AS on_date
  18.       ,cz.run_train_no                                           AS run_train
  19.       ,cz.over
  20.       ,cz.sequence
  21.   FROM (SELECT t2.*
  22.               ,SUBSTR(cycle,MOD(jobday-beg_date, LENGTH(cycle))+1,1)   AS item -- 原来少写了个LENGTH
  23.          FROM (SELECT train.*
  24.                      ,(CASE WHEN NVL(p.dflg,0)=0 THEN p.today + (CASE WHEN train.days>0 THEN train.days ELSE 10 END)
  25.                             ELSE today
  26.                        END) AS jobday     --- 如果dflg为空则从train表中取得
  27.                FROM train
  28.                    ,(SELECT dflg   -- 根据end_date,start_date算出一个today的集合。如果相等或end_date为空则只有一行
  29.                            ,start_date + ROWNUM -1 AS today
  30.                            ,train_no
  31.                        FROM seat_parameter
  32.                      CONNECT BY ROWNUM <= NVL(end_date,start_date) - start_date +1
  33.                      ) p
  34.                WHERE train.flag=0 AND train.end_date >= p.today
  35.                      AND (train.train_no=p.train_no OR NVL(p.train_no,'0')='0')
  36.               ) t2
  37.         ) t
  38.       ,stop_station cz
  39. WHERE t.jobday BETWEEN t.beg_date AND t.end_date
  40.        AND t.item<>'0'
  41.        AND cz.train_no=t.train_no
  42.        AND t.jobday BETWEEN cz.beg_date AND cz.end_date
  43.        AND cz.flag=0
  44. /


  45. CREATE OR REPLACE VIEW vw_seat
  46. AS    --- 利用上述视图vw_train和附加逻辑生成席位
  47. WITH tr AS (SELECT * FROM vw_train)
  48.     ,vw_seat_no AS (SELECT ROWNUM as seat_no FROM DUAL CONNECT BY ROWNUM<=200)
  49. SELECT -- 第一部分:发布无号席位
  50.        tr.train_no          AS train_no
  51.       ,tr.gride             AS gride
  52.       ,tr.station_num-1     AS end_station
  53.       ,tr.jobday            AS start_date
  54.       ,0                    AS carno
  55.       ,0                    AS purpose
  56.       ,0                    AS seat_type
  57.       ,0                    AS shortest_station
  58.       ,0                    AS flag
  59.       ,tr.beg_station       AS beg_station
  60.       ,tr.on_date           AS on_date
  61.       ,tr.run_train         AS run_train
  62.       ,0                    AS pro
  63.       ,vw_seat_no.seat_no   AS seat_no
  64. FROM  tr
  65.      ,vw_seat_no
  66. WHERE --tr.station_num-1 > tr.sequence        
  67.        tr.over >= vw_seat_no.seat_no
  68. UNION ALL -- 第二部分:发布普通席位
  69. SELECT tr.train_no          AS train_no
  70.       ,ps.gride             AS gride
  71.       ,ps.end_station       AS end_station
  72.       ,tr.jobday            AS start_date
  73.       ,ps.carno             AS carno
  74.       ,ps.purpose           AS purpose
  75.       ,(CASE WHEN ps.seat_type = 20 THEN 20+vw_seat_type_adj.rn         -- 硬卧是一席3号,下中上。seat_type:20=硬卧,21硬卧下,22硬卧中,23硬卧上
  76.              WHEN ps.seat_type = 30 THEN 31+MOD(vw_seat_no.seat_no+1,2) -- 软卧是一席一号单下双上: 30软卧,31软卧下,32软卧上。
  77.              ELSE ps.seat_type
  78.         END)                AS seat_type
  79.       ,ps.shortest_station  AS shortest_station
  80.       ,0                    AS flag
  81.       ,tr.beg_station       AS beg_station
  82.       ,tr.on_date           AS on_date
  83.       ,tr.run_train         AS run_train
  84.       ,0                    AS pro
  85.       ,vw_seat_no.seat_no   AS seat_no
  86.   FROM tr
  87.       ,pre_seat ps
  88.       ,pre_seat_index psi
  89.       ,vw_seat_no
  90.       ,(SELECT ROWNUM AS rn FROM DUAL CONNECT BY ROWNUM<=3) vw_seat_type_adj
  91. WHERE psi.train_no=tr.train_no AND psi.item=tr.item AND tr.jobday BETWEEN psi.beg_date AND psi.end_date AND psi.flag=0
  92.        AND ps.pre_id = tr.train_no||':'||tr.item||':'||TO_CHAR(psi.beg_date,'YYYYMMDD')
  93.        AND tr.sequence = ps.beg_station   -- 和无号不同
  94.        AND vw_seat_no.seat_no BETWEEN ps.beg_seatno AND ps.end_seatno
  95.        AND (ps.seat_type=20       --- 硬卧,连接三行
  96.             OR ps.seat_type <>20 AND vw_seat_type_adj.rn = 1   -- 非硬卧,只连接一行
  97.            )
  98. /

  99. CREATE OR REPLACE VIEW vw_new_seat
  100. AS
  101. SELECT * FROM vw_seat v
  102. WHERE NOT EXISTS (SELECT 1 FROM seat s
  103.                     WHERE s.start_date  = v.start_date
  104.                           AND s.beg_station = v.beg_station
  105.                           AND s.Train_no    = v.Train_no
  106.                           AND s.Carno       = v.Carno
  107.                           AND s.seat_no     = v.seat_no
  108.                           AND s.seat_type   = v.seat_type
  109.                   )
  110. /

  111. --- 建立存储过程生成席位:
  112. CREATE OR REPLACE PROCEDURE make_seats (
  113.           p_train_no     IN VARCHAR2 DEFAULT NULL
  114.          ,p_dflg         IN NUMBER    DEFAULT 0    ---- 如果1则不用TRAINS里面的偏移量      
  115.          ,p_offset_days  IN NUMBER    DEFAULT 0    ---- 缺省当天则偏移为0, +1为第二天
  116.          ,p_created_days IN NUMBER    DEFAULT 1    ---- 缺省一天
  117.          )
  118. AS
  119.    lv_timestamp DATE := SYSDATE;
  120. BEGIN
  121.    INSERT INTO seat_parameter (    -- 参数表
  122.           dflg            -- 控制JOBDAY的计算
  123.          ,start_date      -- today
  124.          ,end_date        -- 如果非空,则可以生成多天的数据
  125.          ,train_no        -- 如果为0或NULL则忽略
  126.           )
  127.    VALUES(p_dflg
  128.          ,TRUNC(SYSDATE)+p_offset_days
  129.          ,TRUNC(SYSDATE)+p_offset_days + p_created_days -1
  130.          ,p_train_no
  131.          );


  132.    INSERT INTO seat (
  133.           train_no
  134.          ,gride            -- grade?      
  135.          ,end_station
  136.          ,start_date
  137.          ,carno
  138.          ,purpose
  139.          ,seat_type
  140.          ,shortest_station
  141.          ,flag
  142.          ,beg_station
  143.          ,on_date
  144.          ,run_train
  145.          ,pro
  146.          ,seat_no
  147.          ,used_time
  148.          ,used_dev
  149.          ,used_uid
  150.          )
  151.    SELECT train_no
  152.          ,gride
  153.          ,end_station
  154.          ,start_date
  155.          ,carno
  156.          ,purpose
  157.          ,seat_type
  158.          ,shortest_station
  159.          ,flag
  160.          ,beg_station
  161.          ,on_date
  162.          ,run_train
  163.          ,pro
  164.          ,seat_no
  165.          ,lv_timestamp AS used_time
  166.          ,'xwfb' AS used_dev
  167.          ,'xwfb' AS used_uid
  168.      FROM vw_new_seat;


  169.    MERGE INTO pre_seat_index psi
  170.    USING (SELECT DISTINCT psi.ROWID rid
  171.             FROM pre_seat_index psi
  172.                 ,vw_train tr
  173.            WHERE psi.train_no=tr.train_no AND psi.item=tr.item AND tr.jobday BETWEEN psi.beg_date AND psi.end_date AND psi.flag=0
  174.          ) n
  175.    ON (n.rid = psi.ROWID)
  176.    WHEN MATCHED THEN UPDATE
  177.         SET psi.distribute_time = lv_timestamp;

  178.    COMMIT;

  179. END make_seats;
  180. /
  181. -- 执行结果:

  182. SQL> SQL> SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25
  183.   26   27   28   29   30   31   32   33   34   35   36  
  184. View created.

  185. SQL> SQL> SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25
  186.    26   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51  
  187. 52   53   54  
  188. View created.

  189. SQL> SQL>   2    3    4    5    6    7    8    9   10   11   12  
  190. View created.

  191. SQL> SQL> SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25
  192.   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51
  193.   52   53   54  55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75  
  194. Warning: Procedure created with compilation errors.
复制代码

[ 本帖最后由 yulihua49_cu 于 2009-6-29 09:34 编辑 ]

使用道具 举报

回复
论坛徽章:
0
359#
发表于 2009-6-29 10:39 | 只看该作者
原帖由 yulihua49 于 2009-6-26 11:23 发表

回来了哈,欢迎欢迎!
11G是个好消息,如果是,我可能会改进我的软件支持之。
实践证明我的方案数据库服务器的负载非常轻。
2000个客户端同时抢票,这已经是一个大铁路局的负荷量了。10个TUXEDO服务进程活动起来,历时12.8秒。
瞬间CPU利用率达到60%,12个ORACLE进程CPU使用在1%-5%不等。
应用服务器CPU达到60%,WSH和kpsrv进程轮流上场,每个进程在7%-8%。看到了应用服务器和数据库服务器分担负荷。

你的存储过程我编译过不去,我还以为找不到你了呢,这事就放下了。
找了个小伙子看了你的存储过程,据说是看懂了,他老是忙,没跟他仔细弄这事。

最近做了一个吧TUXEDO与数据库分开的试验,说明一定问题。

使用了一个双核32位的PC机。10个TUXEDO 服务进程。

每次申请2个席位,包含登录、查询车次、席位申请,没有申请到席位。单个任务运行时间比较慢:
客户端数:                   在数据库一起的64位服务:               分开的32位服务:
1                                              0.06秒                                  0.11秒
1000                                        7.8秒                                     6.1秒

单个的时间长了,多请求时间短了,体现了一定的并行性。如果没有这个并行,应该15秒左右。有3个不同性质的过程在并行:
数据存取(在数据库服务器)、数据传输(在两个网络,中间服务器对数据库,对客户端)、数据处理(中间服务器)。

ORACLE的客户端是否也有一定的buffer能力呢?如果是,中间服务器访问数据库的量还可以少,不过我看结论可能是否定的。
我不怀疑PL/SQL的能力,但是:
一个数据库服务器的吞吐量是有限的,现在只让他干一点点存取的事,它就有时间为很多很多中间服务器工作,系统总吞吐量大增。
我们可以用很多中间服务器,让业务逻辑尽可能在此进行,这是总方针。

上边的测试,把客户端与数据库在一起,TUXEDO单独的,数据库开销中含有客户端开销。

再汇报一个测试结果:

我把tuxedo客户端移到tuxedo服务器一起,在32比特2core机器上,数据库还在64bit4core机器上。
每次申请2个席位,包含登录、查询车次、席位申请,没有申请到席位。
1客户端      1000客户端
0.107             26.372

慢了很多,其中大部分开销在于产生新进程。


TUXEDO的CPU:94%,数据库的CPU:2.7%。可以看出数据库负担很轻,可以带动许多这样的TUXEDO服务器。

应该把客户端放到单独的机器上试验。

无论TUXEDO客户端和服务器,用64bit机器的性能远远高于32比特机器,多核性能提升也很关键。

[ 本帖最后由 yulihua49_cu 于 2009-6-29 10:48 编辑 ]

使用道具 举报

回复
论坛徽章:
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
360#
 楼主| 发表于 2009-6-29 12:53 | 只看该作者
原帖由 yulihua49_cu 于 2009-6-29 10:39 发表

上边的测试,把客户端与数据库在一起,TUXEDO单独的,数据库开销中含有客户端开销。

再汇报一个测试结果:

我把tuxedo客户端移到tuxedo服务器一起,在32比特2core机器上,数据库还在64bit4core机器上。
每次申请2个席位,包含登录、查询车次、席位申请,没有申请到席位。
1客户端      1000客户端
0.107             26.372

慢了很多,其中大部分开销在于产生新进程。


TUXEDO的CPU:94%,数据库的CPU:2.7%。可以看出数据库负担很轻,可以带动许多这样的TUXEDO服务器。

应该把客户端放到单独的机器上试验。

无论TUXEDO客户端和服务器,用64bit机器的性能远远高于32比特机器,多核性能提升也很关键。

现在,把客户端移到另一台机器,2.4G,1core,MEM=500M虚拟机。
1000个进程:
real    0m35.843s
user    0m15.921s
sys     0m19.669s
   --  完全是在自己消耗CPU。

本机CPU 78%,TUXEDO CPU 18.5%,ORACLE CPU 2.6%
在1000个进程启动,分配成功1835个席位的测试里,
席位申请的最长响应时间176ms,平均响应时间35.1ms。
由于进程是在33秒里陆续启动的,数据还不是很说明压力。

看来客户端自己用于进程启动、连接的开销不小。应用服务器分担数据库的作用也很大。
进一步的精确测试有待于使用loadrunning测试软件。

[ 本帖最后由 yulihua49 于 2009-6-29 13:13 编辑 ]

使用道具 举报

回复

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

本版积分规则 发表回复

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