Oracle高级消息队列(AQ)自动订阅通知CALLBACK时死锁不出队列问
Oracle高级消息队列(AQ)自动订阅通知CALLBACK时死锁不出队列问题 参考: https://blog.csdn.net/indexman/article/details/43497933 https://blog.csdn.net/cymm_liu/article/details/47149101 可以看到sys用户有demo_queue_callback_procedure的锁,造成队列不能出库。kill到吧。 队列出队是并发执行的,oracle调度队列的速度很快,注意多线程的安全性。反正我使用Count(*)判断数据是否存在还是没用。 CREATE PROCEDURE demo_queue_callback_procedure( r_dequeue_options.wait := dbms_aq.no_wait;//这个是关键 DBMS_AQ.DEQUEUE( queue_name => descr.queue_name, dequeue_options => r_dequeue_options,255);"> message_properties => r_message_properties,255);"> payload => o_payload,255);"> msgid => v_message_handle ); INSERT INTO demo_queue_message_table ( message ) VALUES ( 'Message [' || o_payload.message || '] ' || 'dequeued at [' || TO_CHAR( SYSTIMESTAMP,255);"> 'DD-MON-YYYY HH24:MI:SS.FF3' ) || ']' ); END; / (1)wait的两个值forever和no_wait是指如果当前队列中无消息时,是否进行等待,默认等待。 (2) navigation的两个值first_message和next_message,一般出于性能考虑我们使用后者,或者在第一次出队时使用前者而在随后的出队中使用后者: 如果Oracle高级队列不能自动出队,一要考虑死锁,如果数据不重要可以删除队列表数据,使用AQ的包删除,不是直接删除队列表的数据。另一种方式是把订阅者删除了。不出队可以重启Oracle可以解决。 因为Oracle会实时调度demo_queue_callback_procedure,所以会造成demo_queue_callback_procedure编译时会死锁,特别是调用了其他的过程,造成demo_queue_callback_procedure失效,自动编译要死锁的。使用动态语句调用其他存储过程可以解决此问题。 队列超期后也不能自动出队,只有手动出队了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |