|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2011 Messages : 95 ![]() |
bonsoir
l'erreur suivante s'affiche en exécutant mon prg tandis que j'ai pas fermé mon resultSet mais je n'arrive pas à comprendre pourquoi cela. voici un bout de code qui cause l'erreur: Code :
|
||
|
|
00
|
|
|
#2 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2011 Messages : 95 ![]() |
apparemment le pb est du à la requête update qui est à l’intérieur de while car si j'élimine cette instruction et je fais un simple affichage l'erreur n'est plus affichée. mais le pb que j'ai besoin de la requete update comment résoudre ça s'il vous plait?
|
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : avril 2003 Messages : 1 609 ![]() |
tu as l'erreur car en effet, tu utilises ton statement dans la boucle alors qu'il est déjà en cours d'utilisation. Le statement.executeUpdate(query); doit passer le premier coup puis le next() sort en erreur car le statement a été fermé.
Pour résoudre le problème, il te suffit d'utiliser 2 objets statement différents. Par contre, ça n'est pas très joli ... Et surtout n'oublie pas de fermer tes resultset et statements après utilisation dans un bloc finally (cf la FAQ)
__________________
"If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!" Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/ |
|
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Howard HydeArchitecte de système d'information Inscription : janvier 2012 Messages : 1 ![]() |
Je crois qu'il serait mieux, au lieu d'avoir une instruction SQL SELECT suivi d'un boucle d'instructions UPDATE, metre q'une instruction SQL MERGE, comme celui-ci:
Code :
Voici un document sur l'instruction MERGE: http://docs.oracle.com/cd/B19306_01/...ments_9016.htm Le livre suivant aussi peut être interesant: 'Java Web Database Application Development' á: http://javawebdb.com |
||
|
|
00
|
|
|
#5 |
![]() ![]() |
Le mieux ca reste de faire tout ça en une seule opération. Il est dans 99.9% des cas inutile et contre performant de faire un select d'itérer dessus et, pour chaque row lu, de mettre à jour une base de données. Le language SQL permet de faire tout ça en une seule passe!
Ceci devrais faire l'affaire (je suis un peu rouillé en sql) et éviter le ping-pong réseau. Code sql :
UPDATE connectivite c SET c.nbreAmis = (SELECT count(idPageAmi) FROM connectivite c2 WHERE c2.idPage = c.idPage) edit: le MERGE est effectivement probablement plus performant, pas vu
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
00
|
|
|
#6 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2011 Messages : 95 ![]() |
bonjour
moi j'ai déjà résolu mon pb à l'aide du conseil présenté par in mais je ne comprends pas ce que HowardHyde a dit et concernant la solution de tchize_ j'ai compris mais ce que je comprends pas pourquoi vous me proposez d'autres solutions est ce que la première solution proposé par in n'est pas juste ? |
|
|
00
|
|
|
#7 |
![]() ![]() |
Imaginons que t'ais 100.000 lignes, correspondant à disons 5000 pages. Tu va construire, interpréter et exécuté dans la transaction 5001 requetes updates. alors qu'en faisant tout en une seule requete SQL, tu va n'avoir qu'une requete. Si le serveur met 200ms / requete, c'est la différence entre une opération qui se fera en 2 secondes et une opération qui se fera en 15 minutes. Sans compter que l'opération avec 5000 aller / retour va bien charger ton réseau et ton SGBD.
Bref, SQL est un language, utilisez le comme tel.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2011 Messages : 95 ![]() |
merci pour l'explication mais quand je mets la requete que tu m'as proposé l'erreur suivante est affichée:You can't specify target table 'c' for update in FROM clause
|
|
|
00
|
|
|
#9 | |
|
Membre Expert
![]() Inscription : avril 2003 Messages : 1 609 ![]() |
Citation:
, mais effectivement je n'ai pas fait attention à ce que tu voulais faire ...C'est beaucoup mieux de faire ça en une seule requête. Le Merge est plus performant mais s'il te fait peur pour la maintenance, utilise l'update simple. Tu as dû mal recopier la solution de tchize_. Il te manques sûrement un 2 Tu ne peux pas faire un select sur la table que tu update.
__________________
"If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!" Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/ |
|
|
|
00
|
|
|
#10 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2011 Messages : 95 ![]() |
Tu as dû mal recopier la solution de tchize_. Il te manques sûrement un 2
en fait je suis sur que j'ai bien copié le code de tchize. Tu ne peux pas faire un select sur la table que tu update. selon la recherche que j'ai effectué concernant l'erreur affiché la cause de cet erreur est comme vous m'avez dit on ne peut pas faire un select dans un update donc la requete apparemment n'est pas totalement correcte. |
|
|
00
|
|
|
#11 | ||
![]() ![]() |
J'ai exécuté le code que je t'ai donné ici, sans aucun problème:
Code sql :
UPDATE connectivite c SET c.nbreamis = (SELECT count(idPageAmi) FROM connectivite c2 WHERE c2.idPage = c.idPage) Résultat: Code x :
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
||
|
|
00
|
|
|
#12 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2011 Messages : 95 ![]() |
c'est bizarre mais la meme erreur est affiché :You can't specify target table 'c' for update in FROM clause
Code :
|
||
|
|
00
|
|
|
#13 |
![]() ![]() |
C'est peut etre ton SGDB qui refuse ça (limitation), j'ai testé sur oracle. Maintenant, essaie la version merge qui t'es fournie plus haut.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
00
|
|
|
#14 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2011 Messages : 95 ![]() |
s'il vous plait si c'est possible vous pouvez m'expliquer un peu la requete merge
Code :
USING (SELECT idPage, count(idPageAmi) AS nbreAmis FROM connectivite GROUP BY idPage) y // y ici qu'est qu'elle signifie quel son role |
|
|
00
|
|
|
#15 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2011 Messages : 95 ![]() |
une autre remarque peut etre importante que moi je travaille avec mysql et non pas oracle et quand j'écris cette requete une erreur s'affiche indiquant:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MERGE INTO connectivite x USING (SELECT idPage, count(idPageAmi) AS nbreAmis FRO' at line 1 |
|
|
00
|
|
|
#16 |
![]() ![]() |
Mysql ne supporte pas les updates combines à un select sur la même table. Et le mot clé MERGE n'est pas supporté non plus :s
Donc je vous recommanderais de créer une table temporaire avec le select, puis de faire l'update. Ca ne fait que deux requetes et les tables temporaires sont rapides. Maintenant, d'une manière plus basique, je trouve curieux votre structure de donnée Stocker le nombre d'amis sur la même row que "un amis" ca fait quand même une sacré duplication de données.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
00
|
|
|
#17 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2011 Messages : 95 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#18 |
![]() ![]() |
JE recommenderais soit de stocker le nombre d'amis dans une table séparé (solution la plus performante mais nécessite de la maintenance) ou de calculer simplement cette information via un group by à chaque fois que vous en avez besoin (un peu moins performant mais devrais être rapide à calculer avec un index sur la colonne).
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
00
|
|
|
#19 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2011 Messages : 95 ![]() |
merci pour tout les conseils que vous m'avez donné mais honnêtement je veux revenir à la première solution proposé peut etre elle n'est pas très performante mais ça la plus simple à mon avis.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com