2014-02-26 8 views
0

oracle AQ 및 spring-jms를 사용하기 시작했으며 올바르게 작동합니다.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이 선택을 생산하는 알고, 나는이 엄청난 양을 줄일 수있는 방법이 될 수 있습니다 ... 성능 문제가 발생합니다 : ~ 1000 메시지를 내 큐 불구하고가는 BUS_BILLING_RECEIVE_QT 때 나는 아래 썼다 110000 개 선택이 ?

답변

0

이 문은 dequeue_mode (dequeue_options_t 유형의 필드)가 LOCKED 또는 REMOVE (BROWSE 또는 REMOVE_NODATA가 아님) 일 때 dbms_aq.dequeue 문 뒤에있는 내부 SQL 문입니다.

금액을 줄이려면 큐를 덜 dequeue해야합니다.

0

https://erikwramner.wordpress.com/2016/06/08/oracle-aq-jms-performance, 수신 제한 시간 부분을 참조하십시오. 요컨대 메시지가 도착하면 오라클은 대기중인 모든 세션을 깨우고 모두 동일한 선택을 실행합니다. 오직 하나만 성공할 것이지만 이것은 매우 비쌉니다. 우리는 오라클에보고했으나 한 스레드를 깨우고 Java에서 notify 및 notifyAll을 비교하여 문제를 해결하고 싶지 않습니다.

https://jira.spring.io/browse/SPR-14225을 참조하십시오. 특히 Spring에서 수정을 위해 제출 한 가져 오기 요청을 참조하십시오. 현재의 해결책은 DefaultMessageListenerContainer를 서브 클래스 화하고, receiveNoWait를 폴링하고 잠깐 Java로 잠자는 것입니다. 따라서 데이터베이스의로드가 크게 줄어 듭니다. 또는 리스너 수를 줄일 수 있지만 일반적으로 옵션이 아닙니다!