Gestion de la connexion OCI8 et de la mise en file d'attente

Fonctions de connexion

L'extension oci8 fournit trois fonctions différentes pour se connecter à Oracle. La fonction de connexion standard est la fonction oci_connect(). Cette fonction crée une connexion à la base de données Oracle et retourne une ressource utilisée par les futurs appels à la base de données.

La connexion Ă  un serveur Oracle est une opĂ©ration raisonnablement coĂ»teuse en termes de temps que cela nĂ©cessite. La fonction oci_pconnect() utilise un cache persistant de connexions qui peut ĂȘtre rĂ©utilisĂ© Ă  travers diffĂ©rents scripts. Cela signifie qu'une seule connexion sera utilisĂ©e par processus PHP (ou un fils Apache).

Si l'application se connecte à Oracle en utilisant un jeu différent de droits de base de données pour chaque utilisateur web, le cache persistant utilisé par la fonction oci_pconnect() devient moins approprié car l'augmentation du nombre d'utilisateurs concurrents va affecter les performances du serveur Oracle, car il devra maintenir trop de connexions en cache. Si l'application est de ce type, il est recommandé d'optimiser l'application en utilisant les options de configuration oci8.max_persistent et oci8.persistent_timeout (elles donnent le contrÎle sur la taille et la durée de vie du cache de connexions persistantes) ou utiliser le pool de connexions résidentes d'Oracle (pour les bases de données Oracle 11g et suivants), ou encore, utiliser plutÎt la fonction oci_connect().

Les fonctions oci_connect() et oci_pconnect() emploient un cache de connexions ; si on fait des appels multiples Ă  oci_connect(), en utilisant les mĂȘmes paramĂštres dans un script donnĂ©, le second appel ainsi que les suivants retournent le gestionnaire de connexion existant. Le cache utilisĂ© par la fonction oci_connect() est nettoyĂ© Ă  la fin de l'exĂ©cution du script ou lorsqu'on ferme explicitement le gestionnaire de connexion. oci_pconnect() a un comportement sensiblement identique, Ă  la diffĂ©rence que le cache est maintenu sĂ©parĂ©ment et est conservĂ© entre les requĂȘtes HTTP.

Il est important de se souvenir de cette fonctionnalitĂ© de cache, car elle donne l'apparence que les deux gestionnaires ne sont pas isolĂ©s au niveau des transactions, (ils reprĂ©sentent en fait le mĂȘme gestionnaire de connexion, ils ne sont donc absolument pas isolĂ©s). Si l'application a besoin de deux connexions sĂ©parĂ©es, isolĂ©es au niveau des transactions, il faut utiliser la fonction oci_new_connect().

Le cache de la fonction oci_pconnect() est effacĂ© et toutes les connexions Ă  la base de donnĂ©es sont closes lorsque le processus PHP se termine, aussi, les connexions persistantes n'ont d'intĂ©rĂȘt que lors de l'utilisation de PHP comme module Apache ou utilisĂ© avec FPM ou similaire. Les connexions persistantes n'ont aucun intĂ©rĂȘt via oci_connect() lorsque PHP est utilisĂ© comme CGI ou en ligne de commande.

oci_new_connect() crée toujours une nouvelle connexion au serveur Oracle, indépendamment de l'existence d'autres connexions. Les applications web à fort trafic doivent éviter d'utiliser oci_new_connect(), particuliÚrement dans les sections les plus chargées de l'application.

Les connexions persistantes peuvent dĂ©sormais ĂȘtre fermĂ©es par l'utilisateur, permettant ainsi un meilleur contrĂŽle des ressources de connexion. Les connexions persistantes peuvent maintenant ĂȘtre fermĂ©es automatiquement lorsqu'aucune variable PHP ne les rĂ©fĂ©rence, comme ce pourrait ĂȘtre le cas Ă  la fin d'un contexte d'une fonction utilisateur PHP. Ceci annulera toutes les transactions non validĂ©es. Ces changements dans les connexions persistantes font qu'elles fonctionnent comme les fonctions non-persistantes, simplifiant l'interface, permettant une plus grande cohĂ©rence de l'application et de prĂ©visibilitĂ©. DĂ©finir la directive oci8.old_oci_close_semantics Ă  On pour retrouver le comportement historique.

Le rĂ©-Ă©tablissement automatique des connexions persistantes PHP aprĂšs le redĂ©marrage d'un processus Apache ou FPM fait que les triggers LOGON sont uniquement recommandĂ©s pour dĂ©finir les attributs de session et non les requĂȘtes de connexions utilisateurs par application.

Pool de connexion DRCP

PHP supporte le pool de connexions résidentes Oracle (DRCP). DRCP permet d'utiliser plus efficacement la mémoire de la base de données et permet une meilleure évolution. Peu ou pas de modifications sont nécessaires afin de profiter de DRCP.

DRCP est prévu pour les applications qui se connectent en utilisant peu de schéma de base de données, et qui conservent les connexions ouvertes sur une courte période de temps. Les autres applications doivent utiliser le processus dédié à la base de données Oracle, ou utiliser les serveurs partagés.

DRCP bénéficie des 3 fonctions de connexion, mais seule la fonction oci_pconnect() offre le plus de performance.

Pour rendre DRCP disponible avec OCI8, la version des bibliothĂšques clientes Oracle utilisĂ©es par PHP ainsi que la version de la base de donnĂ©es Oracle doivent ĂȘtre 11g ou supĂ©rieure.

La documentation sur DRCP peut ĂȘtre trouvĂ©e dans les diffĂ©rents manuels Oracle. Par exemple, se reporter Ă  la » configuration du pool de connexions rĂ©sidentes Ă  la base de donnĂ©es de la documentation Oracle pour un exemple d'utilisation. Un » livre blanc sur DRCP contient plusieurs informations internes sur DRCP.

Pour utiliser DRCP, installer l'extension OCI8 et les bibliothÚques Oracle 11g (ou ultérieur), puis, suivre ces étapes :

  • En utilisant les privilĂšges d'administrateur de la base de donnĂ©es, utiliser un programme comme SQL*Plus pour commencer un pool de connexion Ă  la base de donnĂ©es :

        SQL> execute dbms_connection_pool.start_pool;
    
  • Optionnellement, utiliser dbms_connection_pool.alter_param() pour configurer les options DRCP. Les options courantes du pool peuvent ĂȘtre trouvĂ©es en utilisant la vue DBA_CPOOL_INFO.

  • Mettre Ă  jour les chaĂźnes de connexion utilisĂ©es. Pour les applications PHP qui se connectent actuellement via un nom de connexion rĂ©seau comme MYDB:

        $c = oci_pconnect("myuser", "mypassword", "MYDB");
    

    modifier le fichier tnsnames.ora et ajouter une clause (SERVER=POOLED), par exemple :

        MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
               (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
               (SERVER=POOLED)))
    

    Sinon, il est possible de modifier la syntaxe de connexion facile en PHP et ajouter :POOLED aprĂšs le nom du service :

        $c = oci_pconnect("myuser", "mypassword", "myhost.dom.com:1521/sales:POOLED");
    
  • Éditer php.ini et choisir le nom de la classe de connexion. Ce nom indique une division logique du pool de connexion et peut ĂȘtre utilisĂ© pour isoler le pool des diffĂ©rentes applications. Toutes applications PHP utilisant le mĂȘme utilisateur ainsi que la mĂȘme valeur de classe de connexion pourront se partager le pool de connexions, permettant ainsi d'obtenir une plus grande disponibilitĂ©.

        oci8.connection_class = "MY_APPLICATION_NAME"
    
  • ExĂ©cuter l'application, se connecter Ă  la base de donnĂ©es 11g (ou supĂ©rieur).

Note:

Les applications utilisant Oracle Client libraries 10g qui ont besoin de la performance des connexions persistantes, peuvent réduire la quantité de mémoire allouée au serveur de la base de données en utilisant les serveurs partagés Oracle (connu auparavant comme serveurs multithreadés). Se reporter à la documentation Oracle pour plus d'informations.

Note:

La modification d'un mot de passe lors de connexions DRCP échouera avec l'erreur "ORA-56609: Usage not supported with DRCP". Ceci est une restriction documentée de la base de données Oracle 11g.

add a note

User Contributed Notes

There are no user contributed notes for this page.