2017-05-05 55 views
2

我們擁有基於Oracle AQ的消息傳遞系統 - 它運行良好,入隊和出隊沒有任何問題。以編程方式檢查Oracle AQ隊列是否存在

現在我們得到了一個請求,在啓動之前和運行時添加一些完整性檢查,例如「檢查提供的db用戶是否真的存在隊列」和「定期檢查隊列中的消息數量」。

後者似乎相當容易解決,查找queuetable,計數的消息數,但第一個怪異的我。 通過文檔和DatabaseMetaData可用的方法,我沒有看到一種方法來實際檢查這一點,而不嘗試排隊/出隊。數據庫告訴我關於表,鍵,模式等的所有信息,但是我不能爲我的生活尋找隊列。奇怪的是,我也找不到可排隊的球員,雖然這些可能根本不是古典方式中的「桌子」。

我錯過了什麼嗎?信息不可用或在其他地方?

回答

2

要檢查隊列存在於你的用戶,我建議你檢查USER_QUEUES表:

SELECT * FROM USER_QUEUES 
WHERE name = '<that_queue>' 

對於他的名字,你知道(具有DBA權限)其他用戶:

SELECT * FROM DBA_QUEUES 
WHERE owner = '<that_user_name>' 
    AND name = '<that_queue>' 
1

嘗試這個查詢。

select name, queue_type, waiting,ready,expired 
    from user_queues qu 
    join V$AQ v on qu.qid = v.qid 
    where qu.name = 'queu_name' 

user_queses/all_queses/dba_queses - 包含關於問題的信息。

查看v$aq - 包含有關quesues的統計信息。 (統計數據不會實時刷新。)

+0

這通常足夠好。但是請注意,在某些情況下,v $ aq中的統計信息可能是明顯錯誤的。例如,即使有數據要讀取,隊列深度也可以列爲負數。最安全的方法是在隊列表上使用select count來過濾狀態。 – user2612030

相關問題