为什么我的Oracle AQ在多用户队列中这么慢

时间:2010-11-27 00:53:56

标签: oracle queue jms oracle-aq

对Oracle AQ来说是新手,但它似乎应该让我正在进行的项目变得简单。

我想创建一个包含多个持久订阅者的队列,但我在测试中发现一旦有2个订阅者正在监听,一切都会变慢。

当我有一个用户收听时,一切都很快。我在队列中创建新消息,并且几乎立即被侦听器消耗。

然后我从另一台服务器添加另一个监听器。 Oracle立即放慢速度。在队列中创建消息需要60多秒。几分钟后才会消息。

我想知道,当队列是多用户时会有更多的开销吗?仅在服务器启动时才开销?或者它会永远存在吗?

我使用单用户队列进行了第二次测试,但没有遇到这些问题。

也许我在侦听器配置中做错了什么?

这是我设置队列表的方式:

EXEC dbms_aqadm.create_queue_table(queue_table=>'MY_QUEUE_TABLE',
     queue_payload_type=>'sys.aq$_jms_text_message',
     multiple_consumers=>TRUE);

这是我的配置:

<jms:listener-container 
        connection-factory="AQjmsFactory"
        container-type="default"
        destination-type="durableTopic"
        client-id="MY-ADAPTER" 
        acknowledge="transacted">
    <jms:listener destination="MYA_INFO_QUEUE" ref="personUpdateListener" subscription="MYADAPTERJ"/>
    <jms:listener destination="MYB_INFO_QUEUE" ref="courseUpdateListener" subscription="MYADAPTERJ"/>
</jms:listener-container>

1 个答案:

答案 0 :(得分:0)

这不是真正的“开销”,而是模型如何与多个订阅者一起工作。消息传递有一定程度的“旋转”和“减速”时间。也就是说,在这些延迟期间,数据库仍处于相对空闲状态。在等待处理开始时,您不应该看到显着的CPU /内存/ IO消耗。

如果我理解事情是如何工作的,那么有后台作业可以处理以特定间隔运行的AQ消息。当作业没有运行时,你不会刻录任何循环,但也没有发生任何事情。这就像是说当你的发动机没有运转时,或者当你坐在红灯下时,你的法拉利很慢。

要测试性能,您可能不应该担心这些空闲时间,因为队列中有许多消息需要处理。也就是说,当法拉利在开放的道路上时!