Requête non CASTée qui renvoie null

yayalb84 Messages postés 1 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 15 octobre 2010 - 15 oct. 2010 à 09:28
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 15 oct. 2010 à 10:09
Bonjour,

Tout d'abord, désolé mais je suis loin d'être un expert dans ces choses là, j'espère réussir à être suffisamment précis.

J'ai récupéré la responsabilité d'un site, hébergé chez un fournisseur au canada sur lequel tourne TOMCAT 6.0.20, et qui fonctionnait très bien jusqu'à il y a quelques jours.

Depuis quelques jours donc, certaines requètes MySQL ne marchaient plus. Toujours les mêmes, mais pas toutes. Après avoir investigué un peu, je me suis rendu compte que dans ces requêtes, certains champs était renvoyés en NULL. Etonné, j'ai lancé directement les mêmes requêtes dans phpMyAdmin pour voir si la base de donnée avait souffert quelques dommages : rien, les requêtes fonctionnent très bien.

Je me suis rendu compte que les champs qui renvoyait la bonne valeur dans mon code Java étaient ceux qui étaient de la forme "SELECT .... DATE_FORMAT(..).." ou "SELECT ... IF(BLABLA;"Bonjour;"Au revoir") ...". Je me suis donc dit qu'il pouvait y avoir un problème de typage. J'ai pris l'une des requêtes problématique, et j'ai ajouté dans tous les champs de la requête "CAST(... AS CHAR)". Et là, miracle, la requête fonctionne.

Le site en question contenant un nombre assez important de requêtes, je me vois mal les changer toutes une par une. J'ai demandé au support s'ils avaient fait une mise à jour : il ont uploadé récemment un nouveau mysql-connector-java (5.10 je crois). Cela dit, je ne vois pas bien pour ces requêtes non castées fonctionnaient avec une version précédente, et pas avec la nouvelle. Je précise que ces problèmes apparaissent pour des requêtes que je n'ai pas touchées depuis plusieurs mois.... Alors?

Le seul message d'erreur auquel j'ai accès est :
Oct 14, 2010 11:40:52 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet equipes.equipe_detail threw exception
java.lang.NullPointerException
at fr.locmaria.hb.DBEquipe.getClassement(DBEquipe.java:296)
at org.apache.jsp.equipes.equipe_005fdetail_jsp._jspService(equipe_005fdetail_jsp.java:69)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:619)

Et je suis sûr que les requêtes s'exécutent : j'ai vérifié, elles renvoient un hashmap avec le bon nombre de lignes, le bon nombre de colonnes, juste des champs NULL qui ne devraient pas l'être.

Enfin, dernière précision, l'éxecution de toutes les requêtes se fait via une procedure executeSelect qui n'a pas changé elle non plus... Et qui semble fonctionner encore pour certaines requêtes.


Je suis face à un mur, j'ai réellement du mal comprendre ce qui peut faire que, sans changement, CERTAINES requêtes ne fonctionnent plus.

Récemment, je me suis même rendu compte que dans une requête, les champs étaient inversés....si je get("nom"), il me sort le champs "nomPoste", et si je get("nomPoste"), il me renvoit null...... C'est à n'y rien comprendre.

Peut-être cela est-il arrivé à quelqu'un, peut-être est-ce un bug connu, Comme je vous l'ai dit, je ne suis pas expert, mais je vous ai mis là toutes mes constatations.

Merci d'avance!

1 réponse

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
15 oct. 2010 à 10:09
Salut,

Tout dépend de comment a été codé le truc, et quelle était la version du connector MySQL qui était installée avant : normalement, le connector doit conserver la rétro-compatibilité, mais s'il y avait une très vieille version il est possible que certains comportement ait été modifié depuis.

Montre nous le code en question : si dans le code tu récupères un champ de type DATE dans un string niveau java, forcément, tu t'exposes à ce genre de problème : il faut récupérer un type Date, et ensuite le formatter pour en obtenir un type string par la classe DateFormat par exemple.

Si le site est bien codé (une classe qui construit les requêtes par exemple, et non des requêtes écrites en dur dans le code), tes requêtes doivent très facilement pouvoir être changées pour imposer le cast, mais ça ne réglera le problème que temporairement, et il serait plus sage de modifier l'algorithme de récupération des données plutôt, ce serait bien plus pérenne.

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
Rejoignez-nous