public void update(Account entity) throws Exception {
try {
Connection conn = base.getConnection();
PreparedStatement stmt = conn.prepareStatement("update Accounts set Description = ? where Id = ?");
stmt.setString(1,entity.getDescription());
stmt.setInt(2, entity.getId());
stmt.executeUpdate();
stmt.close();
}
catch (SQLException e) {
throw e;
}
}
La requête SQL est repréparée à chaque appel de la méthode update ?
# Pas le principal intérêt
Posté par Infernal Quack (site web personnel) . Évalué à 5.
Mais c'est oublié l'autre intérêt et le plus important à mon avis : la sécurité.
L'utilisation (correcte) de PreparedStatement évite les injections SQL. C'est pour cela qu'il faut toujours en utiliser quand un paramètre doit être passé en argument à ta requête même si tu ne l'utiliseras qu'une fois.
Cf. http://xkcd.com/327/
L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire
[^] # Re: Pas le principal intérêt
Posté par maximegb . Évalué à 0.
Mon questionnement portait sur l'absence d'optimisation dans ce type de code.
[^] # Re: Pas le principal intérêt
Posté par Infernal Quack (site web personnel) . Évalué à 3.
L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire
# Ça dépends (ça dépasse)
Posté par Sébastien Koechlin . Évalué à 2.
En pratique au moins deux des deux SGBD les plus populaires compensent les erreurs des développeurs et les manques d'un certain langage de web dynamique de 3 lettres commençant par P en gérant un cache des dernières requêtes exécutés, ce qui évite d'avoir à recompiler la requête à chaque fois.
[^] # Re: Ça dépends (ça dépasse)
Posté par maximegb . Évalué à 1.
# thread safe
Posté par steph1978 . Évalué à 2.
Mais, rien ne garanti que l'implémentation, fournie par le driver jdbc, est thread safe et donc que le PreparedStatement peut être utilisé en environnement multi-threadé.
si tu es sur que ton exécution est mono-threadé, tu peux éventuellement faire cette optimisation. mais:
1/ tu prends un risque sur la maintenabilité de ton application: passage en multi-threadé impossible sans refacto, ou, plus surement, bug lors du passage en multi-threadé en ayant oublié cette limitation.
2/ ton optimisation ne sert surement à rien pour la plupart des implémentations (oracle en tête).
Bref, à peser le pour et le contre.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.