2014-04-04 64 views
0

我打算在OLTP应用程序中使用Oracle AQ异步通知功能。它在高峰时间内排队的消息数可能会在一分钟内上升到1000。出队回调过程将处理该消息,并将一个条目插入由消息类型决定的表中。Oracle AQ异步通知

我担心的是,它生成的大量排队通知(PL/SQL回调过程是否会针对每个通知进行调用)会导致数据库争用? 是否建议使用异步通知用于此目的,还是我应该使用可以在连续循环中一次退出一条消息的出队轮询过程。

我的数据库版本10gR2中

你专家的帮助是高度赞赏!

回答

0

对于每个排入队列的消息,ORACLE后台进程通过创建一个调度程序作业来调用相关的回调过程。 如果您依赖回调过程,您预计会在一分钟内发送1000条消息,它将增加ORACLE后台进程的负载,并且还会创建那些许多一次性调度程序作业,同样,如果创建的并行调度程序作业数量超过“ job_queue_processes“(ORACLE参数)值在您的数据库中配置延迟消息处理,而如果您选择通过使用AQ侦听器进行轮询以排队,则单个作业可以处理排入队列的所有消息。

+0

那么,对于手动出队进程,是否建议提交运行24 * 7的一次性调度程序作业(占用1个作业槽)并让程序在等待模式下在无限循环中运行出队命令?有没有更好的解决方案在后台连续运行出队过程? – user3496944

+0

即使没有消息要退出队列,一个无限循环作业也不是一个好的选择... 相反,创建一个在循环中使用dbms_aq侦听器从队列中取消队列消息的过程。如果队列中有任何消息,监听器允许您将消息出队,否则会引发LISTENER TIME_OUT异常...使用异常退出循环..因此,只有当消息中至少有一条消息队列。 根据您对此过程的要求,您可以创建一个或多个作业。 – Krishna

+0

感谢您的建议! 据我所知,具有AQ监听器命令的程序应通过运行24 * 7的日程安排作业执行以侦听消息。 即使采用这种方法,作业也将占用1个时隙并持续运行。我理解错了吗?你能否详细说明一下?有没有办法避免连续工作?顺便说一句,与我的方法一样,dequeue命令在循环内部以等待模式运行。如果没有消息,它只是等到消息到达。我想这与LISTEN阻止呼叫类似。 – user3496944