Je fais l'intégration d'un énorme fichier CSV (plusieurs dizaines de milliers de lignes, quasiment 200 colonnes).
Chaque ligne est le produit cartésien de données d'une base dont hélas je ne maîtrise pas les types d'exportations
Code : Tout sélectionner
ID;entreprise;dirigeant;
1;IBM;DUPONT;
1;IBM;DURAND;
2;EDF;DUBOIS;
2;EDF;MARTIN;
Pour simplifier le code, j'ai défini des index uniques: un index unique sur l'ID dans la table des entreprises et un index unique sur le couple (id de l'entreprise, nom du dirigeant) dans la table des dirigeants (je rappelle que je donne un exemple simplifié). Comme ça, je n'ai pas à me poser de question quand je fais mes INSERT : soit l'enregistrement n'est pas déjà dans la table et il est inséré ; soit il y ait déjà et Oracle me renvoie une erreur duplicate index et n'effectue pas l'insertion.
Cela marche. Jusqu'au moment où Oracle m'indique une erreur "ORA-01000: maximum open cursors exceeded" (nombre de curseurs ouverts dépassés). Et à partir de là, il n'y a plus aucune insertion possible : à chaque insertion, il y a cette erreur.
A chaque fois que je relance le code, cela plante exactement au même endroit au bout d'un gros millier d'insertions (ou plutôt de tentatives d'insertions)
J'ai essayé de mettre des temporisations de quelques millisecondes entre chaque INSERT pour lui laisser le temps de fermer les curseurs ; cela permet d'aller un peu plus loin, mais pas beaucoup plus.
En cherchant sur les forums, j'ai souvent trouvé cette erreur associée à du java. Les conseils sont de se déconnecter de la base de temps en temps pour fermer les curseurs et de se reconnecter. C'est ce que j'ai mis en place : toutes les 50 insertions, je fais un disconnect et je me reconnecte. Je fais même un unset du handler de la base de données entre la déconnexion et la reconnexion.
Encore une fois, je gagne un peu, mais au bout d'un moment, j'ai à nouveau mes curseurs ouverts en dépassement.
J'en arrive à douter que les ordres de déconnexion de PHP effectuent réellement une déconnexion de la base ! Pourtant quand j'interromps le script et que je relance, les premières insertions fonctionnent à nouveau : donc la "fin" du PHP ferme bien la connexion.
Est-ce que quelqu'un a déjà eu ce problème ? Si oui, comment l'a t'il résolu ?
(J'aimerais éviter si c'est possible de faire un select avant chaque insert pour voir si l'enregistrement est déjà ou pas dans la base).
Merci de vos réponses.
Ce que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.