2014-08-27 2 views
3

J'ai la classe de requête suivante avec 2 méthodes, la méthode insert() est utilisée fréquemment et deleteRecord() ne l'est pas.Quand créer/initialiser l'instruction préparée

public class Query1 { 

private final static String INSERT = "insert into info values (?, current_timestamp)"; 
private final static String DELETE_RECORD = "delete from info where stamp = ?"; 

private static final Connection con = DatabaseConnection.getInstance(); 

//This method is used frequently 
public static void insert(List<String> numList) throws SQLException { 
    try (PreparedStatement st_insert = con.prepareStatement(INSERT)) { 
     for (int i = 0; i < numList.size(); i++) { 
      st_insert.setString(1, numList.get(i)); 
      st_insert.addBatch(); 
     } 
     st_insert.executeBatch(); 
    } 
} 

// This method is NOT used frequently 
public static void deleteRecord(Timestamp stamp) throws SQLException { 
    try (PreparedStatement st = con.prepareStatement(DELETE_RECORD)) { 
     st.setTimestamp(1, stamp); 
     st.execute(); 
    } 
} 

I converti classe Query1 au-dessous dans laquelle le PreparedStatement utilisé par la méthode insert() est initialisé dans le bloc statique car il est fréquemment utilisé. Est-ce que cela optimise le code en considérant l'utilisation d'instructions préparées ou n'est-ce pas une bonne pratique? sinon comment le faire? (Je suis un débutant à JDBC et n'ai rencontré aucun exemple de code comme celui-ci.)

Toutes les suggestions seraient grandement appréciées.

+2

Cela pourrait dépendre de la fréquence à laquelle votre méthode est appelée, mais je vous conseillerais de rester avec l'ancienne afin de garantir périodiquement le nettoyage des ressources. Dans la dernière approche (statique), vous n'avez aucun moyen de nettoyer les ressources. Aucun cas ne gère les mises à jour de connexion, mais cela constituerait une autre raison d'utiliser l'ancien, de sorte que vous traitiez mieux les autres problèmes de base de données. – user1676075

+1

de ce livre http://oreilly.com/catalog/jorajdbc/chapter/ch19.html Je pense que PreparedStatement, si vous ne le réutilisez pas pour beaucoup d'instructions, est en fait un peu lent qu'un énoncé normal. Bien sûr, PreparedStatement est une bonne approche pour éviter l'injection SQL. – Leo

Répondre

1

Votre raisonnement est correct. Une requête fréquemment exécutée pourrait bénéficier de l'utilisation d'un PreparedStatement. Exactement ce que les compromis vont varier entre les DB. Vous avez balisé javadb, et si c'est ce que vous utilisez, PreparedStatements ne sera jamais plus lent, car les instructions régulières passent par le même processus de compilation. Cela dit, je suis d'accord avec ceux qui déconseillent de préparer l'instruction dans un bloc statique. J'essaie généralement de préparer des instructions dans le constructeur ou une méthode init, de sorte que je puisse réutiliser le ps dans les méthodes fréquemment appelées.

Notez également que même un ps peut être recompilé « derrière votre dos » à cause des changements qui peuvent avoir une incidence sur la façon dont doit/devrait être exécuté la requête (ajout d'indices, les changements dans les statistiques, le changement de privilèges, etc.)