OVH Cloud OVH Cloud

jdbc, auto-increment de mysql et pool

2 réponses
Avatar
Joe
hello,
pour pouvoir récupérer la clé générée automatiquement par mysql lors
d'un insert, j'utilisais jusqu'ici une méthode native de ConnectorJ :
String sql="INSERT INTO ...";
com.mysql.jdbc.Statement phrase =
(com.mysql.jdbc.Statement)base.createStatement();
phrase.executeUpdate(sql);
numvente=(int)phrase.getLastInsertID();

tout allait bien, jusqu'au jour où je décidais d'utiliser un
gestionnaire de pool de connexion, en lieu et place de mon singleton
habituel
problème : ce pool (SmartPool, pour ne pas le nommer), est
fourni avec son implémentation de Statement, ce qui lui permet
de rester complétement générique par rapport aux différents drivers

du coup, le pool n'utilise non pas l'interface java.sql.Statement, mais
une classe propriétaire qui implémente cette interface ; conséquence :
le code ci-dessus génère un ClassCastException, puisque
createStatement() me renvoie maintenant une classe qui n'est plus
déclinable en com.mysql.jdbc.Statement

y a t'il un moyen de s'en sortir ?

merci d'avance
joe

2 réponses

Avatar
Emmanuel Puybaret
Salut,

pour pouvoir récupérer la clé générée automatiquement par mysql lors
d'un insert, j'utilisais jusqu'ici une méthode native de ConnectorJ :
String sql="INSERT INTO ...";
com.mysql.jdbc.Statement phrase > (com.mysql.jdbc.Statement)base.createStatement();
phrase.executeUpdate(sql);
numvente=(int)phrase.getLastInsertID();

tout allait bien, jusqu'au jour où je décidais d'utiliser un
gestionnaire de pool de connexion, en lieu et place de mon singleton
habituel
problème : ce pool (SmartPool, pour ne pas le nommer), est
fourni avec son implémentation de Statement, ce qui lui permet
de rester complétement générique par rapport aux différents drivers

du coup, le pool n'utilise non pas l'interface java.sql.Statement, mais
une classe propriétaire qui implémente cette interface ; conséquence :
le code ci-dessus génère un ClassCastException, puisque
createStatement() me renvoie maintenant une classe qui n'est plus
déclinable en com.mysql.jdbc.Statement

y a t'il un moyen de s'en sortir ?


C'est marrant en cherchant une info sur MySQL hier je suis tombé par hasard
sur un sujet qui parlait de méthodes ajoutées dans le JDK 1.4 pour ça.
Regarde les méthodes :
public boolean execute (String  sql, int autoGeneratedKeys)
public ResultSet getGeneratedKeys ()

de la classe java.sql.Statement

ou la méthode :
public PreparedStatement prepareStatement (String  sql,
int autoGeneratedKeys)
de la classe java.sql.Connection

La méthode public boolean supportsGetGeneratedKeys () de
java.sql.DatabaseMetaData te dira si ces nouvelles fonctionnalités sont
supportées par le driver JDBC. Apparemment ces fonctionnalités ont bien été
implémentées dans la dernière version du driver MySQL.
Voir http://www.mysql.com/articles/autoincrement-with-connectorj.html pour
plus d'infos

Je pense que ça devrait t'aller, non ?

Cordialement
--
Emmanuel PUYBARET
Email :
Web : http://www.eteks.com
Auteur du Cahier du programmeur Java [1] / Editions Eyrolles :
http://www.eteks.com/services/cahierjava1.html

Avatar
Joe
La méthode public boolean supportsGetGeneratedKeys () de
java.sql.DatabaseMetaData te dira si ces nouvelles fonctionnalités sont
supportées par le driver JDBC. Apparemment ces fonctionnalités ont
bien été implémentées dans la dernière version du driver MySQL.
Voir http://www.mysql.com/articles/autoincrement-with-connectorj.html
pour plus d'infos

oui, ConnectorJ implémente ces fonctionnalités de JDBC 3.0 qui étaient

tres attendues

ca va permettre de simplifier les choses ; en attendant, il va falloir que
je modifie ce gestionnaire de pool qui, lui, n'est pas compatible jdbc 3.0
: vive l'opensource ;-))

merci pour l'info en tout cas
joe