[JSP/DB2] Problème avec une requête d'insertion - Résolu

Problème avec une requête d'insertion - Résolu [JSP/DB2] - Java - Programmation

Marsh Posté le 12-05-2006 à 17:33:58    

Bonjour,
 
je travaille actuellement sur un outil développé uniquement en JSP, avec des tags JSTL (oui, je sais, c'est pas propre et c'est pas fait pour, mais j'ai pas le choix : je voulais du PHP, on me l'a refusé et on m'a donné ça à la place).
 
J'ai un problème avec une requête d'insertion, dans une base DB2.
 
Voici le code qui me pose problème :

Code :
  1. <sql:update dataSource="jdbc/chrono" var="resultInsertNiv10"
  2. sql="insert into tache (id_macro, ta_ordre, ta_niveau, ta_debut,
  3. ta_fin, id_bascule, ta_libelle, ta_jalon, id_chrono, id_ressource_resp, ta_pa_resp,
  4. id_application, ta_flag) values (?, ?+1, 1, ?, ?, 1, ?, ?, ?, ?, 'P', ?, 1)">
  5. <sql:param value="${macro}" />
  6. <sql:param value="${ordre}" />
  7. <sql:param value="${param.debut}" />
  8. <sql:param value="${param.fin}" />
  9. <sql:param value="${param.libelle}" />
  10. <sql:param value="${jalon}" />
  11. <sql:param value="${param.id_chrono}" />
  12. <sql:param value="${param.resp}" />
  13. <sql:param value="${param.appli}" />
  14. </sql:update>


 
J'obtiens un retour d'erreur de ma base de données, sous cette forme :

Code :
  1. insert into tache (id_macro, ta_ordre, ta_niveau, ta_debut, ta_fin, id_bascule, ta_libelle,
  2. ta_jalon, id_chrono, id_ressource_resp, ta_pa_resp, id_application, ta_flag) values (?, ?+1, 1,
  3. ?, ?, 1, ?, ?, ?, ?, 'P', ?, 1): String index out of range: 5


 
Je ne comprends pas, je n'arrive pas à reproduire l'erreur, quand je fais une requête similaire, en direct dans ma BDD, pas de problème, et quand je le mets dans mon fichier JSP, paf ! Mon chef me suggère de récupérer, par un moyen ou un autre, le texte de la requête qui est réellement envoyé à la BDD, mais je ne sais pas faire.
 
Quelqu'un a-t-il déjà eu cette situation ? Peut m'aider ? A une idée sur la façon de récupérer le texte strict de la requête susceptible de foirer ? Merci d'avance !
 
 
Solution (25/05/06) : après exploitation des différents messages d'erreurs (le plus dur fut de récupérer le message d'erreur original, et pas encapsulé dans des tags JSP), il s'est avéré que le driver JDBC de mon serveur était différent de celui du serveur de prod. Du coup, j'avais deux champs timestamp dans ma table, que je remplissais avec des données de la forme 'hh:mm'. Eh bien, avec l'autre driver, il fallait lui donner la forme 'hh:mm:ss'. D'où le message "String index out of range", le serveur cherchait la suite du paramètre à passer...
 
Voilà. Merci à tous ceux qui m'ont répondu ! Et si ça peut aider qqn qui a le même genre d'erreur...

Message cité 1 fois
Message édité par tigrou_bis le 02-06-2006 à 14:07:25
Reply

Marsh Posté le 12-05-2006 à 17:33:58   

Reply

Marsh Posté le 12-05-2006 à 17:39:54    

pour monitorer db2 tu peux te servir du script fourni la: http://www-128.ibm.com/developerwo [...] /#listing5
 
Au moins tu auras exactement la requête executée par DB2

Reply

Marsh Posté le 12-05-2006 à 17:48:40    

anapajari a écrit :

pour monitorer db2 tu peux te servir du script fourni la: http://www-128.ibm.com/developerwo [...] /#listing5
 
Au moins tu auras exactement la requête executée par DB2

Merci pour le lien. Je n'ai pas accès directement à cette base, car c'est une base de prod, je ne peux pas toucher au serveur. Mais je peux toujours voir avec mon admin s'il est d'accord pour me monitorer ça :p

Reply

Marsh Posté le 13-05-2006 à 18:44:14    

tu ne peux pas sortir ta requête une fois qu'elle est bindée dans un fichier pour voir quelle tête elle a  ?
 
A mon avis tu dois avoir un problème de paramètre qui n'est pas correctement renseigné (voir plusieurs vu le nombre de ?)

Reply

Marsh Posté le 15-05-2006 à 09:05:46    

moonboot a écrit :

tu ne peux pas sortir ta requête une fois qu'elle est bindée dans un fichier pour voir quelle tête elle a  ?

Le problème est qu'en JSP, il n'y a pas de mode débug, et je n'ai pas (à ma connaissance) de fichier de log qui me permette de voir la requête telle qu'elle est envoyée à la BDD.
 

moonboot a écrit :

A mon avis tu dois avoir un problème de paramètre qui n'est pas correctement renseigné (voir plusieurs vu le nombre de ?)

Je ne pense pas. Ce que j'ai omis de dire, c'est que ce bout de code fonctionne parfaitement sur mon serveur de test (WSAD sous Windows, sur mon poste), mais pas sur mon serveur de prod (Serveur Unix). Les deux serveurs sont "branchés" sur la même BDD (DB2 Unix).

Reply

Marsh Posté le 15-05-2006 à 13:41:10    

Il doit y avoir une log que tu dois pouvoir mettre en route sur le client DB2 de ton serveur.  
Géneralement, il y a un fichier de paramétrage du client à modifier pour que la log trace les ordres envoyées à la base.

Reply

Marsh Posté le 15-05-2006 à 13:43:35    

j'y pense pourquoi ne pas afficher directement dans ta jsp, l'ordre sql bindé, c'est possible ca dans mes souvenirs ?

Reply

Marsh Posté le 15-05-2006 à 15:57:12    

moonboot a écrit :

j'y pense pourquoi ne pas afficher directement dans ta jsp, l'ordre sql bindé, c'est possible ca dans mes souvenirs ?

J'ai effectivement ça, quand je passe en mode débug sur mon serveur :
variable sql du tag <sql:update> : insert into tache (id_macro, ta_ordre, ta_niveau, ta_debut, ta_fin, id_bascule, ta_libelle, ta_jalon, id_chrono, id_ressource_resp, ta_pa_resp, id_application, ta_flag) values (?, ?+1, 1, ?, ?, 1, ?, ?, ?, ?, 'P', ?, 1)
Tableau de paramètres affectés au tag : [83, 2000, 00:00, 00:00, tutu, 0, 253, A8707229, 256]
 
Mais d'après un collègue, l'erreur serait même avant le passage en base de données... Y'a-t-il une compilation différente sous Windows et sous Unix ?
 

Reply

Marsh Posté le 15-05-2006 à 16:18:36    

le msg d'erreur java : string index out of range veut dire que tu essaies d'accéder à une valeur d'un tableau hors périmètre non ?
 
sur tes deux environnements ce sont exactement les mm données ?
 

Reply

Marsh Posté le 15-05-2006 à 16:27:24    

moonboot a écrit :

le msg d'erreur java : string index out of range veut dire que tu essaies d'accéder à une valeur d'un tableau hors périmètre non ?
 
sur tes deux environnements ce sont exactement les mm données ?

Oui, les données sont les mêmes, car j'ai un JDBC vers la même base de données. Je ne vois pas du tout à quel moment, dans mon fichier, je pourrais utiliser un tableau duquel je dépasse les bornes...  :??:  
 
Je crois que je vais demander à mon interlocuteur de refaire une mise en prod en recompilant les fichiers, histoire de voir si ça corrige qqch... Suis un peu désespérée là  :cry:  

Reply

Marsh Posté le 15-05-2006 à 16:27:24   

Reply

Marsh Posté le 15-05-2006 à 17:06:00    

tu as d'autres insert du même type qui plante ?
 
si c'est le cas, cela peut venir de ton jdbc en effet...
si ca n'est pas le cas c'est ton code je pense

Reply

Marsh Posté le 15-05-2006 à 17:33:37    

moonboot a écrit :

tu as d'autres insert du même type qui plante ?
 
si c'est le cas, cela peut venir de ton jdbc en effet...
si ca n'est pas le cas c'est ton code je pense

Eh bien, toutes mes requêtes d'insert qui sont dans ce fichier JSP plantent (j'en ai 6 au total, car 6 cas différents). Par contre, j'ai dans ce même fichier des requêtes d'update, qui elles passent très bien (j'en ai vérifié l'efficacité dans ma BDD).
 
J'ai demandé de l'aide à mon support technique au boulot, on va voir ce que ça donne... Parce que là j'ai passé la journée dessus et vraiment, je sèche :( C'est franchement frustrant de n'avoir rien fait de productif dans une journée comme ça :cry:

Reply

Marsh Posté le 15-05-2006 à 17:39:19    

je comprends...

Reply

Marsh Posté le 15-05-2006 à 18:03:05    

En tout cas, merci beaucoup moonboot pour tes réponses ! :jap:

Reply

Marsh Posté le 15-05-2006 à 18:07:36    

de rien en même temps je t'ai pas trop aidé :/

Reply

Marsh Posté le 16-05-2006 à 09:48:19    

Certes, mais ça fait plaisir de voir qu'on n'est pas tout seul dans ces cas là ;)
 
Pour mon problème, je ne sais pas comment ça va se régler, peut-être que l'erreur disparaitra d'elle-même à la prochaine livraison ? Enfin j'espère... Je planche maintenant sur l'hypothèse d'une différence de compilation entre serveur Windows et Unix...

Reply

Marsh Posté le 16-05-2006 à 18:41:32    

J'ai re-livré mon appli, avec des modifs sensées m'aider à trouver d'où vient le bug, et... c'est pire :cry:
Marre :(

Reply

Marsh Posté le 16-05-2006 à 18:50:40    

tigrou_bis a écrit :

Je ne comprends pas, je n'arrive pas à reproduire l'erreur, quand je fais une requête similaire, en direct dans ma BDD, pas de problème, et quand je le mets dans mon fichier JSP, paf ! Mon chef me suggère de récupérer, par un moyen ou un autre, le texte de la requête qui est réellement envoyé à la BDD, mais je ne sais pas faire.


normal, vu que ce qui est réellement envoyé à la bdd, dans la majorité des cas, c'est ta requete tel quelle. J'en sais rien pour db2, mais mysql et oracle supportent nativement les requetes préparées. (je m'avance peut etre un poil, disons chuis sur à 90% :whistle:)  
Ca dépend entre autres du driver, aussi.
 
Tu plantes ton débugger là ou il faut et tu vois ce qu'il se passe. (T'as au minimum les sources des tags jstl, si pas celles du driver)
 
Un truc qui me semble pas net, moi, dans ta requete, c'est ton ?+1.
Tu peux aussi la décortiquer et voir quand ça déconne. Le message d'erreur étant plutot explicite: en gros y'a un soucis pour binder un parametre.. comme si ta requete n'en comportait que 4 et que tu en bindais un 5e, ou tu lui passais une chaine trop longue?  
 
Va falloir se sortir les doigts du cul et les mettre dans le camboui, un ptit peu, hein ...

Message cité 1 fois
Message édité par the real moins moins le 16-05-2006 à 18:51:47

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-05-2006 à 18:59:21    

the real moins moins a écrit :

normal, vu que ce qui est réellement envoyé à la bdd, dans la majorité des cas, c'est ta requete tel quelle. J'en sais rien pour db2, mais mysql et oracle supportent nativement les requetes préparées. (je m'avance peut etre un poil, disons chuis sur à 90% :whistle:)  
Ca dépend entre autres du driver, aussi.

Après tests, ce n'est pas la BDD qui est en cause.
 

the real moins moins a écrit :

Tu plantes ton débugger là ou il faut et tu vois ce qu'il se passe. (T'as au minimum les sources des tags jstl, si pas celles du driver)

J'ai fait ça. Tout passe comme il faut, les paramètres dans le tableau, tout bien.
 

the real moins moins a écrit :

Un truc qui me semble pas net, moi, dans ta requete, c'est ton ?+1.

Ca fonctionne dans d'autres requêtes (requêtes de mise à jour), appelées avant, dans le même fichier. Pourquoi ça ne fonctionnerait pas là ?

the real moins moins a écrit :

Tu peux aussi la décortiquer et voir quand ça déconne. Le message d'erreur étant plutot explicite: en gros y'a un soucis pour binder un parametre.. comme si ta requete n'en comportait que 4 et que tu en bindais un 5e, ou tu lui passais une chaine trop longue?

Certes. Mais pourquoi ça fonctionne, avec les mêmes paramètres, la même chaîne, sur mon environnement de dév et pas sur celui de prod ? Le code JSP est exactement le même. Voilà pourquoi j'ai demandé s'il existait une différence de compilation entre Windows et Unix, pour un même code...
 

the real moins moins a écrit :

Va falloir se sortir les doigts du cul et les mettre dans le camboui, un ptit peu, hein ...

Merci, ça fait plaisir, des commentaires comme ça. :D Le même genre (en plus vulgaire) que ceux que mon chef me sort depuis 3 jours que je bosse sur ce bug... Tu es démasqué ! :p

Reply

Marsh Posté le 16-05-2006 à 19:00:31    

(oui enfin ton chef, tu vas lui demander gentiment d'aller apprendre ce qu'est un prepared statement et il reviendra ^^)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-05-2006 à 19:01:59    

the real moins moins a écrit :

(oui enfin ton chef, tu vas lui demander gentiment d'aller apprendre ce qu'est un prepared statement et il reviendra ^^)

:D il reconnait quand même qu'il n'y connait rien, mais il me donne des conseils, c'est un chef, hein...

Reply

Marsh Posté le 16-05-2006 à 19:10:04    

tigrou_bis a écrit :

Certes. Mais pourquoi ça fonctionne, avec les mêmes paramètres, la même chaîne, sur mon environnement de dév et pas sur celui de prod ? Le code JSP est exactement le même. Voilà pourquoi j'ai demandé s'il existait une différence de compilation entre Windows et Unix, pour un même code...


compilation? beuh, à part si t'utilises pas la meme version de tomcat(ou autre?), ou la meme version de jdk, non.
 
je pencherais plutot pour une difference au niveau de la db...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 17-05-2006 à 14:34:51    

Le retour d'erreur complet peut-il aider à trouver la cause du bug ? Personnellement, je ne sais pas déchiffrer les lignes en "at com.ibm. ...", mais si quelqu'un a une idée, je suis preneuse...
 

Code :
  1. javax.servlet.jsp.JspException: insert into tache (id_macro, ta_ordre, ta_niveau, ta_debut, ta_fin,
  2. id_bascule, ta_libelle, ta_jalon, id_chrono, id_ressource_resp, ta_pa_resp, id_application, ta_flag)
  3. values (?, ?+1, 1, ?, ?, 1, ?, ?, ?, ?, 'P', ?, 1): String index out of range: 5
  4. at org.apache.taglibs.standard.tag.common.sql.UpdateTagSupport.doEndTag
  5. (UpdateTagSupport.java:196)
  6. at org.apache.jsp._f_5F_ajout_5F_tache._jspService(_f_5F_ajout_5F_tache.java:1926)
  7. at com.ibm.ws.webcontainer.jsp.runtime.HttpJspBase.service(HttpJspBase.java:89)
  8. at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
  9. at com.ibm.ws.webcontainer.jsp.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:365)
  10. at com.ibm.ws.webcontainer.jsp.servlet.JspServlet.serviceJspFile(JspServlet.java:715)
  11. at com.ibm.ws.webcontainer.jsp.servlet.JspServlet.service(JspServlet.java:813)
  12. at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
  13. at com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance.java:110)
  14. at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.java:174)
  15. at com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycleServlet.java:313)
  16. at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet.java:116)
  17. at com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java:283)
  18. at com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch
  19. (ValidServletReferenceState.java:42)
  20. at com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch
  21. (ServletInstanceReference.java:40)
  22. at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:76)
  23. at com.hsbc.hbfr.mdo.securite.SecurityFilter.doFilter(SecurityFilter.java:83)
  24. at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:132)
  25. at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:71)
  26. at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch
  27. (WebAppRequestDispatcher.java:1050)
  28. at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch
  29. (WebAppRequestDispatcher.java:588)
  30. at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward
  31. (WebAppRequestDispatcher.java:206)
  32. at com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java:80)
  33. at com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java:214)
  34. at com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation
  35. (CachedInvocation.java:71)
  36. at com.ibm.ws.webcontainer.cache.invocation.CacheableInvocationContext.invoke
  37. (CacheableInvocationContext.java:116)
  38. at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java:186)
  39. at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java:334)
  40. at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java:56)
  41. at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java(Compiled Code))
  42. at com.ibm.ws.http.HttpConnection.run(HttpConnection.java(Compiled Code))
  43. at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:672)


Message édité par tigrou_bis le 17-05-2006 à 14:36:22
Reply

Marsh Posté le 17-05-2006 à 15:09:34    

tigrou_bis a écrit :


J'ai fait ça. Tout passe comme il faut, les paramètres dans le tableau, tout bien.


bien sur, oui, et ça plante par magie, après, hein ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 17-05-2006 à 15:27:22    

the real moins moins a écrit :

bien sur, oui, et ça plante par magie, après, hein ?

Sans doute... Je me tue à dire que cette erreur n'arrive PAS sur mon serveur de dév. Donc chez moi, tout marche, que je sois en débug ou non. Tu veux peut-être que j'aille trouver le responsable du serveur de prod et que je lui demande "Steuplé, tu peux me laisser bidouiller sur le serveur pendant 1/4h et passer mon fichier en débug / pas à pas ? Promis, je ferai attention à pas planter la machine, pour que tu n'aies pas 200 utilisateurs furax sur le dos..."

Reply

Marsh Posté le 17-05-2006 à 15:29:03    

ben commence par determiner la diff entre ces 2 serveurs, alors... si tu peux pas reproduire le problème, je vois mal comment tu peux rêver de le résoudre.
et accessoirement, apprendre à lire une stacktrace, ça serait pas une perte de temps [:icon12]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 17-05-2006 à 15:52:52    

the real moins moins a écrit :

et accessoirement, apprendre à lire une stacktrace, ça serait pas une perte de temps [:icon12]

Je t'en prie, je ne demande que ça... Que peux-tu m'apprendre sur celle que j'ai indiquée ?
A moins que tu ne préfères me donner un lien vers une doc précise ? Merci d'avance :jap:
 
Edit : autant pour moi, je n'avais pas encore potassé ton topic-cours pour débutants en Java. Je vais donc m'y rendre de ce pas, merci :)


Message édité par tigrou_bis le 17-05-2006 à 15:54:46
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed