2010-11-27 25 views
2

nouvelle à Oracle AQ, mais il semble que cela devrait vraiment faciliter les choses pour le projet sur lequel je travaille.Pourquoi mon Oracle AQ est-il si lent avec la file d'attente multi-consommateurs

Je veux créer une file d'attente avec plusieurs abonnés durables, mais j'ai trouvé dans les tests que tout ralentit une fois que 2 abonnés sont à l'écoute.

Quand un abonné écoute, tout est rapide. Je crée de nouveaux messages dans la file d'attente et presque instantanément ils sont consommés par l'auditeur. Puis j'ajoute un autre écouteur d'un autre serveur. Instantanément, Oracle ralentit. Il faut plus de 60 secondes pour créer un message dans la file d'attente. Le message n'est pas consommé avant quelques minutes.

Je me demande, y a-t-il beaucoup plus de frais généraux quand la file d'attente est multi-consommateur? Est-ce que c'est seulement quand le serveur démarre? Ou sera-t-il toujours là?

J'ai effectué un deuxième test en utilisant une file d'attente mono-consommateur et je n'avais pas ces problèmes.

Peut-être que j'ai fait quelque chose de mal dans ma configuration d'écoute?

Voici comment configurer ma table de file d'attente:

EXEC dbms_aqadm.create_queue_table(queue_table=>'MY_QUEUE_TABLE', 
    queue_payload_type=>'sys.aq$_jms_text_message', 
    multiple_consumers=>TRUE); 

Et voici ma configuration:

<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

Quelle version de base de données/groupe de correctifs? Quelle est la valeur du paramètre de démarrage aq_tm_processes? – REW

+0

Utilisation d'Oracle 10g –

+0

AQ_TM_PROCESSES n'est pas défini –

Répondre

0

Il est pas vraiment « frais généraux » tant que la façon dont fonctionne le modèle avec plusieurs abonnés. Il y a une certaine quantité de temps de "spin-up" et de "spin-down" avec la messagerie. Cela dit, la base de données est encore relativement inactive pendant ces retards. Vous ne devriez pas voir une consommation CPU/mémoire/IO importante en attendant le début du traitement.

Si je comprends comment les choses fonctionnent, il y a des tâches d'arrière-plan qui traitent les messages AQ qui s'exécutent à des intervalles spécifiques. Lorsque le travail n'est pas en cours, vous ne gravez aucun cycle, mais rien ne se passe non plus. C'est comme dire que votre Ferrari est lente lorsque le moteur ne tourne pas, ou lorsque vous êtes assis au feu rouge.

Pour tester performance, vous ne devriez probablement pas vous soucier de ces temps d'inactivité autant que de nombreux messages dans la file d'attente à traiter. Autrement dit, quand la Ferrari est sur la route ouverte!

+0

Je ne suis pas sûr d'être d'accord avec votre analogie. C'est plus comme ça, quand je conduis le Ferarri seul c'est vraiment rapide. Dès qu'une autre personne monte dans la voiture, tout ralentit (car-je-ne-sais-pas-combien de temps) –