Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
LAMI DBA

Articles autour des SGBD Oracle, SQL Server & PostgreSQL

dbms_service.disconnect_session

Hello,
Bien que cela puisse nous faciliter grandement la vie, il existe encore des applications qui se connectent à leur base en utilisant le SID ou alors un service unique.
Le fait de créer plusieurs services et evidemment de les utiliser va permettre entre autres...

  • De cibler l'origine de problèmes de performance lors d'audit.
  • De gérer l'allocation de ressources.
  • De gèrer les connexions à travers le service.
  • ...

Ce petit article va parler ici justement de la possibilité de "killer" un ensemble de sessions utilisant le même service.
Comme d'habitude, la preuve par l'exemple.
Tout d'abord créeons un service et démarrons le.

SQL>
SQL> exec dbms_service.create_service('myservice','myservice');

PL/SQL procedure successfully completed.

SQL> exec dbms_service.start_service('myservice');

PL/SQL procedure successfully completed.

SQL>

Ceci étant fait, je vais ajouter un alias dans mon tnsnames.ora

MYSERVICE =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rasta.localdomain)(PORT = 1521))
    )
    (CONNECT_DATA =
      (service_name = MYSERVICE)
    )
  )

Je vais maintenant ouvrir trois sessionz utilisant le dit service pour se connecter.

SQL>

sqlplus lao/******@myservice


SQL>


Je vérifie que j'ai bien le résultat attendu.

SQL>
SQL> select count(*) from v$session where service_name='myservice';

  COUNT(*)
----------
         3

SQL>


Histoire de varier les plaisirs, dans deux des sessions, je vais executer un Select (avec un beau produit cartésien pour que ca dure un peu ;)) et dans la troisième session un update  que je ne commit pas de suite.
Ce qui donne deux sessions avec le fameux select en cours.

SQL>
SQL>  select count(*) from dba_objects a,dba_objects b;
 select count(*) from dba_objects a,dba_objects b


Et un update attente de commit ou rollback.

SQL>
SQL> update t1 set pk=5;

3 rows updated.

SQL>


Je vais pouvoir maintenant utiliser dbms_service.disconnect_session pour killer d'un coup mes trois sessions.
Disconnect_session prends deux paramètres :

  1. Le nom du service
  2. Un second argument qui peut prendre les valeurs suivantes.
    • 0 => Les sessions seront "killés" à l'issue de la transaction en cours
    • 1 => L'équivalent d'un bon alter system kill.... IMMEDIATE;
    • 2 => NOREPLAY, afin d'éviter une reconnecter une connexion à travers un mécanisme de TAF (Transparent Application Failover). L'utilisation du NOREPLAY, implique également un Kill Immediate.

Assez de discours, let's go !

SQL>
SQL> exec dbms_service.disconnect_session('myservice',0);

PL/SQL procedure successfully completed.

SQL>


Petite vérification.

SQL>
SQL> select count(*) from v$session where service_name='myservice';

  COUNT(*)
----------
         1

SQL>


Plus qu'une connexion utilisant mon service. Et effectivement mes deux "Select" se sont stoppés net.

SQL>  select count(*) from dba_objects a,dba_objects b;
 select count(*) from dba_objects a,dba_objects b
                      *
ERROR at line 1:
ORA-00028: your session has been killed


SQL>


Alors que mon update attend tranquillement son commit ou rollback. Donnons lui donc ce qu'elle attend.

SQL> commit;

Commit complete.


Le commit est bien effectué. En revanche si je veux continuer avec un petit select de vérification sur ma table mise à jour..

SQL> select * from t1;
select * from t1
*
ERROR at line 1:
ORA-00028: your session has been killed


SQL>


Dernière vérification.

SQL>
SQL> select count(*) from v$session where service_name='myservice';

  COUNT(*)
----------
         0

SQL>


Plus aucune session à travers mon service...
Enjoy.

 

Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article