oracle中怎么实现进程的睡眠和唤醒?

[复制链接]
查看11 | 回复9 | 2010-10-8 09:31:21 | 显示全部楼层 |阅读模式
问题描述:
----平台N的操作
BEGIN


PROCA--- 通知另一个平台M
PROCB--接收M的返回信息;


..........
END;

在上面的问题中,A过程通知平台M后,M平台经过处理后返回给平台N,平台N根据M返回的信息来做其他处理.如果平台M一定时间没有返回信息则认为M处理失败.
我想这样实现:
BEGIN
PROC A;

WHILE1 = 1
LOOP

IF--如果接受到M平台的信息

.........

EXIT;

ELSE

....;--统计时间,如果超时,退出并处理

END IF

END LOOP;

END;
但是这样实现性能肯定有影响,我想oracle数据库有没有类似java的东西,当我执行了PROC A 向M平台发送了消息后,就睡眠,接受到M的消息后再唤醒做其他的操作.而不是死等时间到了再处理
[ 本帖最后由 陌上风轻 于 2010-3-28 19:26 编辑 ]
回复

使用道具 举报

千问 | 2010-10-8 09:31:21 | 显示全部楼层
dbms_pipe
回复

使用道具 举报

千问 | 2010-10-8 09:31:21 | 显示全部楼层
通信问题不存在问题,现在的问题是,N发出消息后,要等待M的处理信息.在这个等待的过程中,我想要使当前的session睡眠,等接收到M来的消息后再唤起当前的session.现在如果用循环来处理怕占用资源,不知道有没有更好的方法.
回复

使用道具 举报

千问 | 2010-10-8 09:31:21 | 显示全部楼层
DBMS_PIPE.RECEIVE_MESSAGE第二个参数就是睡眠时间。
回复

使用道具 举报

千问 | 2010-10-8 09:31:21 | 显示全部楼层
学习了。。。
回复

使用道具 举报

千问 | 2010-10-8 09:31:21 | 显示全部楼层
那就是说,我现在可以这样实现?
----平台N的操作
BEGIN


PROCA--- 通知另一个平台M

IF DBMS_PIPE.RECEIVE_MESSAGE('mytest',20) = 0

THEN


..........

ELSE

.............

END IF;
END;
这里面的疑问是: IF DBMS_PIPE.RECEIVE_MESSAGE('mytest',20) = 0是一定会等到20秒后处理,还是说20秒之内只要收到消息就会处理,我理解为后者,如果是这样就能解决,还有就是用这个性能如何?比纯粹的LOOP循环,等待trigger那个好?
回复

使用道具 举报

千问 | 2010-10-8 09:31:21 | 显示全部楼层
是20秒之内收到就会处理。20秒后也会返回TIMEOUT.
你这个"通知另一个平台M"是什么意思?你的代码是“被通知”者,即接收方。
性能当然是睡眠好,LOOP是CPU空转。TRIGGER需要调用者是异步方式的设计。
回复

使用道具 举报

千问 | 2010-10-8 09:31:21 | 显示全部楼层
you can use more stable utility:
"DBMS_AQ"
回复

使用道具 举报

千问 | 2010-10-8 09:31:21 | 显示全部楼层
问题很尖锐,等待高手回帖
回复

使用道具 举报

千问 | 2010-10-8 09:31:21 | 显示全部楼层
嗯,本来系统是异步的,现在要把异步做成同步.
你这个"通知另一个平台M"是什么意思?你的代码是“被通知”者,即接收方。
意思是:我通知M后,M要给我个回复.收到M的回复后我继续做下面的事情.M和我之间是通过网络通信.
因为现在涉及到3个系统,两个是自己的系统,另一个是别人的系统.假设这三个系统分别为N,Q,M
原来的实现方式是:
N把自己要发的消息,通过Q转换为XML格式发给M就算结束;
Q收到M的应答之后并将应答信息转换为TYPE形式给N,N根据M的结果做其他处理是另一个操作了
现在要把这两个异步的过程做成同步的,又不想动太多的东西.即要做成:
N把自己要发的消息,通过Q转换为XML格式发给M,并等待Q收到M的应答之后并将应答信息转换为TYPE形式给N,N根据M的结果做其他处理,这个是一个同步的过程.

我现在的想法是:
----平台N的操作
BEGIN


PROCA--- 通知另一个平台M(中间通过Q转换)

IF DBMS_PIPE.RECEIVE_MESSAGE('mytest',20) = 0--M如果在20秒返回了消息

THEN


..........

ELSE

.............

END IF;
END;
在上面的过程中,如果Q收到M的响应,立即向N发送一个 DBMS_PIPE.SEND_MESSAGE('mytest',0);如果M在20秒内收到就算成功.
现在有个大概想法......
多谢各位~!
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行