【问题标题】:Oracle AQ Asynchronous notificationOracle AQ 异步通知
【发布时间】:2014-04-04 07:27:29
【问题描述】:

我计划在 OLTP 应用程序中使用 Oracle AQ 异步通知功能。在高峰时段,它排队的消息数可能在一分钟内达到 1000 条。出队回调过程将处理消息并将条目插入到由消息类型确定的表中。

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

我的数据库版本是10gR2

非常感谢您的专家帮助!

【问题讨论】:

    标签: oracle10g oracle-aq


    【解决方案1】:

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

    【讨论】:

    • 好吧,对于手动出队过程,是否建议提交一个 24*7 运行的一次性调度程序作业(占用 1 个作业槽)并让程序在等待模式下运行出队命令在无限循环中?有没有更好的解决方案可以在后台连续运行出队进程?
    • 一个无限循环作业不是一个好的选择,因为该过程会持续运行,即使没有要出队的消息...而是创建一个在循环中使用 dbms_aq 侦听器来将消息出队的过程队列。如果队列中有任何消息,侦听器允许您将消息出列,否则它会引发 LISTENER TIME_OUT 异常......使用异常退出循环......因此该过程仅在至少有一条消息时运行队列。您可以根据您对此过程的要求创建一个或多个作业。
    • 感谢您的建议!据我了解,具有 AQ 侦听器命令的过程应通过 24*7 运行以侦听消息的调度程序作业执行。即使采用这种方法,该作业也将占用 1 个永久插槽并连续运行。我理解错了吗?你能详细说明一下吗?有没有办法可以避免连续工作?顺便说一句,与我的方法一样,出队命令在循环内以等待模式运行。如果没有消息,它只是等到消息到达。我想这类似于 LISTEN 阻塞呼叫。
    • 我的意思是,以特定的时间间隔(比如 10 秒)安排作业,如果队列中有任何消息,该作业将继续处理,一旦它完成了从队列中出来的所有消息的处理通过抛出一个 LISTER_TIME_OUT 异常循环并在指定的时间间隔后重复相同的过程。
    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2013-03-17
    相关资源
    最近更新 更多