IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration Oracle Discussion :

RAC et DBMS_PIPE


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut RAC et DBMS_PIPE
    Bonjour,

    je suis en train de tester le fonctionnement de notre application dans un environnement RAC.

    j'avais déjà entendu que dans un environnement multi-instances, 2 sessions connectés sur 2 instances différentes ne pouvaient pas communiquer via dbms_pipe ou dblms_alert.

    Comme le prouve le test case suivant, c'est confirmé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    sqlplus scott/tiger@rac1
     
     
    CREATE OR REPLACE PACKAGE message_api AS
      PROCEDURE send (p_number  IN  NUMBER,
                      p_text    IN  VARCHAR2,
                      p_date    IN  DATE DEFAULT SYSDATE);
      PROCEDURE receive;
    END message_api;
    /
     
     
    CREATE OR REPLACE PACKAGE BODY message_api AS
      PROCEDURE send (p_number  IN  NUMBER,
                      p_text    IN  VARCHAR2,
                      p_date    IN  DATE DEFAULT SYSDATE) AS
        l_status  NUMBER;
      BEGIN
        DBMS_PIPE.pack_message(p_number);
        DBMS_PIPE.pack_message(p_text);
        DBMS_PIPE.pack_message(p_date);
     
        l_status := DBMS_PIPE.send_message('message_pipe');
        IF l_status != 0 THEN
          RAISE_APPLICATION_ERROR(-20001, 'message_pipe error');
        END IF;
      END;
     
      PROCEDURE receive AS
        l_result  INTEGER;
        l_number  NUMBER;
        l_text    VARCHAR2(32767);
        l_date    DATE;
      BEGIN
        l_result := DBMS_PIPE.receive_message (
                      pipename => 'message_pipe',
                      timeout  => DBMS_PIPE.maxwait);
     
        IF l_result = 0 THEN
          -- Message received successfully.
          DBMS_PIPE.unpack_message(l_number);
          DBMS_PIPE.unpack_message(l_text);
          DBMS_PIPE.unpack_message(l_date);
     
          DBMS_OUTPUT.put_line('l_number: ' || l_number);
          DBMS_OUTPUT.put_line('l_text  : ' || l_text);
          DBMS_OUTPUT.put_line('l_date  : ' || l_date);
        ELSE
          RAISE_APPLICATION_ERROR(-20002, 'message_api.receive was unsuccessful. Return result: ' || l_result);
        END IF;              
      END receive;
    END message_api;
    /
     
    ----------------------------------------------------------------------------------------------------------------------------------------
    --						MONO-INSTANCE
    ----------------------------------------------------------------------------------------------------------------------------------------
     
     
    -- To test the package, run the following code in one session. The session will appear to hang, waiting for a message to be read off the pipe.
    conn scott/tiger@rac1
    SET SERVEROUTPUT ON
    EXEC message_api.receive;
     
    -- In another session, run the following code to send a message.
    CONN scott/tiger@rac1
    BEGIN
      message_api.send(p_number => 12345,
                       p_text   => 'This is a test.',
                       p_date   => SYSDATE);
    END;
    /
     
    -- The procedure call in the first session immediately returns, printing out the contents of the message, as seen below.
    l_number: 12345
    l_text  : This is a test.
    l_date  : 20-NOV-2005 13:35:57
     
     
     
     
    ----------------------------------------------------------------------------------------------------------------------------------------
    --						RAC
    ----------------------------------------------------------------------------------------------------------------------------------------
    -- To test the package, run the following code in one session. The session will appear to hang, waiting for a message to be read off the pipe.
    conn scott/tiger@rac1
    SET SERVEROUTPUT ON
    EXEC message_api.receive;
     
     
    -- In another session connected on an other instance, run the following code to send a message.
    CONN scott/tiger@rac2
    BEGIN
      message_api.send(p_number => 12345,
                       p_text   => 'This is a test.',
                       p_date   => SYSDATE);
    END;
    /
     
    -- => The procedure call in the first session is still wainting for a message
    ce test a été fait sous un environnement RAC en 11.1.0.7

    quelqu'un a t'il une solution pour faire communiquer 2 sessions connectées sur 2 instances différentes ?

  2. #2
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    A priori, la communication ne peut se faire que par des objects de la database (tables) puisque c'est la seule chose commune entre 2 instances RAC. DBMS_PIPE passe par la shared pool, donc pas partagée entre 2 instances.
    Don je dirais: stickage dans une table. Et si c'est du genre queue de message, alors Advanced Queuing.
    Cordialement,
    Franck.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    Est-ce qu'un message posté dans une Queue d'oracle est visible depuis les 2 instances ?

  4. #4
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Oui puisque les messages passent par une table.
    Ce sera cependant plus performance si c'est sur la même instance car sinon les blocs devront passer d'une instance à l'autre.

Discussions similaires

  1. [10G] DBMS_ALERT/DBMS_PIPE et RAC
    Par farenheiit dans le forum Administration
    Réponses: 0
    Dernier message: 09/07/2009, 14h59
  2. RAC versus STANDBY
    Par aline dans le forum Oracle
    Réponses: 6
    Dernier message: 29/07/2005, 11h08
  3. Conseil sur une configuration oracle RAC
    Par mrhuve dans le forum Oracle
    Réponses: 44
    Dernier message: 22/07/2005, 15h40
  4. Oracle 9i RAC
    Par quemener dans le forum Oracle
    Réponses: 13
    Dernier message: 21/04/2005, 15h21
  5. Réponses: 7
    Dernier message: 03/12/2004, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo