2014-04-04 104 views
0

我打算在OLTP應用程序中使用Oracle AQ異步通知功能。它在高峯時間內排隊的消息數可能會在一分鐘內上升到1000。出隊回調過程將處理該消息,並將一個條目插入由消息類型決定的表中。Oracle AQ異步通知

我擔心的是,它生成的大量排隊通知(PL/SQL回調過程是否會針對每個通知進行調用)會導致數據庫爭用? 是否建議使用異步通知用於此目的,還是我應該使用可以在連續循環中一次退出一條消息的出隊輪詢過程。

我的數據庫版本10gR2中

你專家的幫助是高度讚賞!

回答

0

對於每個排入隊列的消息,ORACLE後臺進程通過創建一個調度程序作業來調用相關的回調過程。 如果您依賴回調過程,您預計會在一分鐘內發送1000條消息,它將增加ORACLE後臺進程的負載,並且還會創建那些許多一次性調度程序作業,同樣,如果創建的並行調度程序作業數量超過「 job_queue_processes「(ORACLE參數)值在您的數據庫中配置延遲消息處理,而如果您選擇通過使用AQ偵聽器進行輪詢以排隊,則單個作業可以處理排入隊列的所有消息。

+0

那麼,對於手動出隊進程,是否建議提交運行24 * 7的一次性調度程序作業(佔用1個作業槽)並讓程序在等待模式下在無限循環中運行出隊命令?有沒有更好的解決方案在後臺連續運行出隊過程? – user3496944

+0

即使沒有消息要退出隊列,一個無限循環作業也不是一個好的選擇... 相反,創建一個在循環中使用dbms_aq偵聽器從隊列中取消隊列消息的過程。如果隊列中有任何消息,監聽器允許您將消息出隊,否則會引發LISTENER TIME_OUT異常...使用異常退出循環..因此,只有當消息中至少有一條消息隊列。 根據您對此過程的要求,您可以創建一個或多個作業。 – Krishna

+0

感謝您的建議! 據我所知,具有AQ監聽器命令的程序應通過運行24 * 7的日程安排作業執行以偵聽消息。 即使採用這種方法,作業也將佔用1個時隙並持續運行。我理解錯了嗎?你能否詳細說明一下?有沒有辦法避免連續工作?順便說一句,與我的方法一樣,dequeue命令在循環內部以等待模式運行。如果沒有消息,它只是等到消息到達。我想這與LISTEN阻止呼叫類似。 – user3496944