2014-02-26 33 views
0

我们开始使用oracle AQ和spring-jms,它工作正常。但是,当1000〜去的消息,虽然我的队列BUS_BILLING_RECEIVE_QT有110000个选择我下面写道:使用oracle aq和spring-jms时选择太多

select /*+ INDEX(TAB AQ$_BUS_BILLING_RECEIVE_QT_I) */ tab.rowid, tab.msgid, tab.corrid, tab.priority, tab.delay, tab.expiration , tab.retry_count, tab.exception_qschema, tab.exception_queue, tab.chain_no, tab.local_order_no, tab.enq_time, tab.time_manager_info, tab.state, tab.enq_tid, tab.step_no, tab.sender_name, tab.sender_address, tab.sender_protocol, tab.dequeue_msgid, tab.user_prop, tab.user_data from "WORKLOAD_PROD"."BUS_BILLING_RECEIVE_QT" tab where q_name = :1 and (state = :2) order by q_name, state, enq_time, step_no, chain_no, local_order_no for update skip locked 

它会导致性能问题... 可能sombody知道产生这种选择,我怎样才能减少这种巨大的量?

回答

0

当dequeue_mode(dequeue_options_t类型的字段)是LOCKED或REMOVE(不是BROWSE或REMOVE_NODATA)时,此语句是dbms_aq.dequeue语句后面的内部SQL语句。

要减少金额,您必须减少出列次数。

0

请参阅https://erikwramner.wordpress.com/2016/06/08/oracle-aq-jms-performance,关于接收超时的部分。简而言之,当一条消息到达时,Oracle会唤醒所有正在等待的会话,并且它们将发出相同的选择。只有一个会成功,但这是非常昂贵的。我们已经向Oracle报告过,但他们不想修复它(通过唤醒一个线程,比较notify和notifyAll中的Java)。

请参阅https://jira.spring.io/browse/SPR-14225,特别是我在春季提交的修复请求。我们当前的解决方案是子类DefaultMessageListenerContainer,使用receiveNoWait轮询并在Java中短时间休眠。这大大减少了数据库的负载。或者,您可以减少监听器的数量,但通常这不是一个选项!