2010-11-27 36 views
2

對Oracle AQ來說是新的,但它似乎應該能夠讓我正在開發的項目變得更容易。爲什麼我的Oracle AQ非常慢,多用戶隊列

我想創建一個擁有多個持久訂閱者的隊列,但是我發現在測試中,一旦有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

什麼數據庫版本/補丁集? aq_tm_processes啓動參數的值是多少? – REW 2010-11-28 04:07:28

+0

使用Oracle 10g – 2010-11-29 22:23:49

回答

0

這是不是真的「開銷」這麼多的模型是如何工作的多個用戶。消息傳遞有一定的「旋轉」和「旋轉」時間。也就是說,數據庫在這些延遲期間仍然相對閒置。在等待處理開始時,您不應該看到顯着的CPU /內存/ IO消耗。

如果我理解事情是如何工作的,則會有後臺作業處理以特定間隔運行的AQ消息。當作業沒有運行時,您不會焚燒任何循環,但也不會發生任何事情。這就像是說你的法拉利在發動機不運轉或者你坐在紅燈下時速度很慢。

要測試性能,您應該不用擔心這些空閒時間,因爲隊列中有很多消息需要處理。也就是說,當法拉利在開闊的道路上!