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

ORM PHP Discussion :

ORA-0100 nombre maximum de curseurs ouverts dépassé : [Doctrine]


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut ORA-0100 nombre maximum de curseurs ouverts dépassé :
    Bonjour à tous,
    J'ai fait plusieurs recherches mais aucune ne m'a permis de résoudre mon problème.

    Voilà j'ai une liste d'option qui peuvent être visibles ou non par l'utilisateur, et donc dans le Back-Office, j'ai un écran d'administration avec une checkbox "Checked".

    Cet écran contient une soixantaine de lignes que je peux check ou uncheck, je dois donc regarder lesquels l'utilisateur coche ou décoche et faire les update en base... jusque là aucun soucis.

    Seulement lorsque je change trop de checkbox, j'ai Doctrine qui me renvoie une erreur Oracle : ORA-01000 : nombre maximum de curseurs ouverts dépassé.

    J'ai donc un dans mon foreach pour l'update ligne par ligne.
    J'ai essayé à la place de faire mes requête en SQL pur c'est à dire de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query .= "UPDATE .....";
    dans mon foreach et de passer ma requête contenant 60 update à exécuter mais sans plus de succès...

    Sauriez-vous comment faire pour régler ce soucis ?

    Merci d'avance.

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Le problème vient de la boucle et le la limitation du nombre des curseurs (ressources...) sur Oracle. Tu peux régler le paramètre OPEN_CURSOR de ta base (ou négocier avec ton DBA).

    Accessoirement, on peut se demander pourquoi Doctrine ne libère pas ses ressources dans ce genre de boucles. Peut-être es-tu dans une transaction ?

    Une solution serait de shunter le save() de Doctrine et de faire ton update directement comme dans ton second exemple. En ce cas, libérer les ressourtces après chaque execute() par un appel à Doctrine_Query::free() devrait faire l'affaire.

    Sinon, il faudra accéder à la couche PHP OCI abstraite par Doctrine et là, ça va être compliqué.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    Je vais tenter le Doctrine_Query::free()
    Toutefois, après mon save() je faisais déjà un $monObjet->free() donc ... :s

  4. #4
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Doctrine_Record::free() libère la mémoire associée à l'objet, comme un _delete() en somme, pas forcément les ressources. Et même, en toute logique, il n'y a aucune raison a priori que le delete d'un enregistrement doive libérer la ressource associée à la requête.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    J'ai trouvé une autre solution, qui me va très bien.

    Tous les 50 updates je ferme la connection avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Doctrine_Manager::connection()->close();
    puis la rouvre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Doctrine_Manager::connection()->connect();
    Et le tour est joué.

    Merci de ton aide.

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Tu as aussi la possibilité d'inclure ta boucle dans une transaction plutôt que de fermer la connexion tous les 50. A ce moment là, tu commits la transaction et en commence une nouvelle.

    Tu devrais en prime y gagner en performance.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ORA-01000: nombre maximum de curseurs ouverts dépassé
    Par opensource dans le forum Débuter
    Réponses: 3
    Dernier message: 20/04/2011, 13h30
  2. ORA-01000: Nombre maximum de curseurs ouverts atteint
    Par nihilist dans le forum Oracle
    Réponses: 2
    Dernier message: 18/08/2010, 12h08
  3. ORA-01000: nombre maximum de curseurs ouverts dépassé
    Par ouadie99 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 01/09/2008, 10h03
  4. Réponses: 7
    Dernier message: 02/07/2008, 14h17
  5. Réponses: 6
    Dernier message: 17/09/2007, 12h50

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