0

我们开始使用 oracle AQ 和 spring-jms 并且效果很好。但是当大约 1000 条消息通过我的队列 BUS_BILLING_RECEIVE_QT 时,我在下面写了 110000 条选择:

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

它会导致性能问题...可能有人知道是哪个产生了这个选择,以及如何减少这个巨大的数量?

4

2 回答 2

0

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

要减少数量,您必须减少出队的频率。

于 2014-07-01T19:31:21.083 回答
0

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

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

于 2017-05-05T12:35:49.367 回答