【问题标题】:Too much selects when using oracle aq and spring-jms使用 oracle aq 和 spring-jms 时选择过多
【发布时间】:2014-02-26 11:44:23
【问题描述】:

我们开始使用 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

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

【问题讨论】:

    标签: spring-jms oracle-aq advanced-queuing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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 中短时间休眠。这大大减少了数据库的负载。或者,您可以减少侦听器的数量,但通常这不是一种选择!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多