我想创建一个包含多个持久订阅者的队列,但我在测试中发现一旦有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>
答案 0 :(得分:0)
这不是真正的“开销”,而是模型如何与多个订阅者一起工作。消息传递有一定程度的“旋转”和“减速”时间。也就是说,在这些延迟期间,数据库仍处于相对空闲状态。在等待处理开始时,您不应该看到显着的CPU /内存/ IO消耗。
如果我理解事情是如何工作的,那么有后台作业可以处理以特定间隔运行的AQ消息。当作业没有运行时,你不会刻录任何循环,但也没有发生任何事情。这就像是说当你的发动机没有运转时,或者当你坐在红灯下时,你的法拉利很慢。
要测试性能,您可能不应该担心这些空闲时间,因为队列中有许多消息需要处理。也就是说,当法拉利在开放的道路上时!