Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

JDBC et MySQL

5 réponses
Avatar
Francis JUGE-BOIRARD
Bonjour à tous....
J'utilise le driver JDBC Connector/J de AB pour me connecter à une base
de données MySQL.
Tout fonctionne bien depuis déjà deux ans.

Entre autre données stockées, je stock des objets.

La version 3.0.17 du driver fonctionne correctement par contre, quand
j'ai installé la version 3.1.10, impossible de "désèrialiser" les
objets, une classcast exception est systèmatiquement levé...

Le problème est le même avec la version 3.2.0 béta.

Ci dessous le code qui lève l'exception avec les version 3.1 et 3.2 du
driver mais qui fonctionne correctement avec la version 3.0.

/**
* Lecture d'un Object au sens java du terme.
* @param query la requète permettant de localiser l'Object.
* @param columnIndex l'index de la colonne du ResultSet obtenu
aprés lancement de la requète
* auquel sera trouvé l'Object.
* <strong>Attention</strong> : Cette m&eacute;thode utilise l'index du
{@link java.sql.PreparedStatement} sous-jacent.
* Les index sont donc {1, 2, 3} etc... (pas d'index 0).
* @exception SQLException en cas d'erreur d'acc&eacute;s &agrave; la
base de donn&eacute;es.
*/
public Object readObject (String query, int columnIndex)
throws SQLException
{
PreparedStatement ps = connection.prepareStatement (query);
resultSet = ps.executeQuery ();
resultSet.first ();
try
{
Object result = resultSet.getObject (columnIndex);
resultSet.close ();
return (result);
}
catch (NullPointerException n)
{
return (null);
}
catch (SQLException s)
{
return (null);
}
}

5 réponses

Avatar
damien guerin
Quelle est la ligne concernée? Il est où le cast?
Avatar
Francis JUGE-BOIRARD
damien guerin wrote:

Quelle est la ligne concernée? Il est où le cast?

Bonjour,

Ci dessous la ligne qui lève l'exception (ClassCastException).
planning[idx] = (Planning) GaoBureau.getJa ("DataAlias").readObject
(query, 1);

A noter le fait qu'en tracant le programme, je n'ai même pas pu faire un
Object test = (Object) GaoBureau.getJa ("DataAlias").readObject (query, 1);
Cette ligne aussi lève une exception.

Je soupconne un problème de page de code.

Avatar
Francis JUGE-BOIRARD
Une information suplémentaire.

Le problème se manifeste seulement lors de la désérialisation d'un objet.
Pour le démontrer, j'ai fait le test suivant :
Sérialisation avec le driver 3.1
Lecture (sans problème) avec le driver 3.0 de l'objet sérialisé avec la
version 3.1.
Avatar
damien guerin
Que renvoie getJa ?? Un objet perso?
Que renvoie Object test = GaoBureau.getJa ("DataAlias").readObject
(query, 1);
Toujours une Exception? Laquelle? La même?
printStack() donne quoi?
Il nous manque des billes à priori. Il est évident qu'il y a eu un
changement mais c'est très probalement contournable. Je doute qu'il y
ait des regressions de ce type...
Avatar
Francis JUGE-BOIRARD
Francis JUGE-BOIRARD wrote:
Bonjour, à tous.....
Ci-dessous la version du code qui pose problème....

/**
* Lecture d'un Object au sens java du terme.
* @param query la requ&egrave;te permettant de localiser l'Object.
* @param columnIndex l'index de la colonne du ResultSet obtenu
apr&eacute;s lancement de la requ&egrave;te
* auquel sera trouv&eacute; l'Object.
* <strong>Attention</strong> : Cette m&eacute;thode utilise l'index du
{@link java.sql.PreparedStatement} sous-jacent.
* Les index sont donc {1, 2, 3} etc... (pas d'index 0).
* @exception SQLException en cas d'erreur d'acc&eacute;s &agrave; la
base de donn&eacute;es.
*/
public Object readObject (String query, int columnIndex)
throws SQLException
{
PreparedStatement ps = connection.prepareStatement (query);
resultSet = ps.executeQuery ();
resultSet.first ();
try
{
Object result = resultSet.getObject (columnIndex);
resultSet.close ();
return (result);
}
catch (NullPointerException n)
{
return (null);
}
catch (SQLException s)
{
return (null);
}
}
En lisant la documentation du driver 3.1, je vois la ligne suivante :

Table 1.3. MySQL Types to Java Types for ResultSet.getObject()
...
LONGBLOB byte[]
Cette ligne indique que les LONGBLOB sont "mapper" comme des byte[].


Ci-dessous la version de mon code qui fonctionne.
/**
* Lecture d'un Object au sens java du terme.
* @param query la requ&egrave;te permettant de localiser l'Object.
* @param columnIndex l'index de la colonne du ResultSet obtenu
apr&eacute;s lancement de la requ&egrave;te
* auquel sera trouv&eacute; l'Object.
* <strong>Attention</strong> : Cette m&eacute;thode utilise l'index
du {@link java.sql.PreparedStatement} sous-jacent.
* Les index sont donc {1, 2, 3} etc... (pas d'index 0).
* @exception SQLException en cas d'erreur d'acc&eacute;s &agrave; la
base de donn&eacute;es.
*/
public Object readObject (String query, int columnIndex)
throws SQLException
{
PreparedStatement ps = connection.prepareStatement (query);
resultSet = ps.executeQuery ();
if (!resultSet.first ())
return (null);
try
{
byte[] byteResult = resultSet.getBytes (columnIndex); // Ligne
ajouté
ObjectInputStream ois = new ObjectInputStream (new
ByteArrayInputStream (byteResult)); // Ligne ajouté
Object result = ois.readObject (); // Ligne ajouté
resultSet.close ();
return (result);
}
catch (NullPointerException n)
{
n.printStackTrace ();
return (null);
}
catch (SQLException s)
{
s.printStackTrace ();
return (null);
}
catch (IOException i)
{
i.printStackTrace ();
return (null);
}
catch (ClassNotFoundException c)
{
c.printStackTrace ();
return (null);
}
}

Du coup, je ne vois plus bien l'intéret du readObject de la classe
resultSet....