2010-05-19 3 views
0

Je veux savoir que si un objet PreparedStatement est initialisé deux fois comme indiqué dans l'extrait de code ci-dessous et fermé une seule fois dans le bloc finally, ne pourra-t-il pas se fermer? Je ne reçois aucune erreur dans ce code, mais ce sera une meilleure idée d'utiliser 2 readyStatements différents au lieu d'un. Je pense qu'il ne ferme pas le prepareStatement au n ° 1.Instruction préparée initialisée tiwice et fermée une fois

Connection conn = null; 
PreparedStatement ps = null; 
try { 
    conn = getConnection(); 
    ps = conn.prepareStatement(QueryUtil.UPDATE_POLICY_DETAILS); // #1 
    ps.setInt(1, iCancellationPolicyId); 
    ps.executeUpdate(); 

    //some code here 


    ps = conn.prepareStatement(QueryUtil.UPDATE_POLICY_CHARGES); // #2 
    ps.setInt(1, iCancellationPolicyId); 
    ps.executeUpdate(); 


    //some code here 


} catch (SQLException sqlExp) { 
    sqlExp.printStackTrace(); 
    LOG.fatal(sqlExp); 
} finally { 
    ps.close(); 
    conn.close(); 

} 

Répondre

1

Vous êtes en utilisant deux instructions préparées différentes ... il est juste que vous êtes seulement en utilisant une variables. Le résultat du deuxième appel à prepareStatement est affecté à ps, après quoi vous n'avez plus aucune référence à la première instruction préparée. Une partie de moi pense que vous devez utiliser deux variables distinctes et fermer chaque instruction séparément. L'autre partie de moi se demande si la fermeture de la connexion fermera automatiquement toutes les instructions préparées associées à la connexion de toute façon ... Je ne vois aucune garantie de cela.

Je pense que l'approche la plus robuste serait en effet d'utiliser deux variables différentes. Idéalement, vous devriez également fermer chaque élément dans son propre bloc finally - sinon, si le premier appel close se produit, vous passerez le suivant.

+0

D'accord! Idéalement, la fermeture d'une connexion devrait également fermer l'état préparé. Cela m'a simplement échappé. Mais pour être encore plus sûr de créer des déclarations individuelles est une meilleure idée. Merci beaucoup. –

+0

+ pour avoir pris le temps de lire le code avec les deux yeux. - b.t.w. Pourriez-vous jeter un coup d'oeil à ce http://stackoverflow.com/questions/2842849/help-translating-reflector-deconstruction-into-compilable-code –

0

Je vois quelques petites choses ici. D'abord, vous réattribuez simplement la valeur de ps avec la même valeur. Le deuxième conn.prepare est donc redondant et peut être éliminé.

La seconde est que vous voudrez peut-être vous demander si une préparation est nécessaire. Généralement, vous préparez une commande utilisée plusieurs fois. Je soupçonne que la préparation pour 2 utilisations est moins efficace que simplement l'exécution de la commande.

Je peux me tromper.

edit: J'ai tort. J'ai mal lu les valeurs de commande. Donc, oui, vous voudriez probablement avoir des variables discrètes pour vous assurer qu'elles sont correctement fermées.

Mais l'observation concernant la préparation est correcte, je pense.

+0

Pourquoi pensez-vous qu'il est en train de réaffecter la valeur de ps avec la même valeur? Il appelle prepareStatement avec un argument différent. –

+0

@Jon - je ne sais pas. il m'a juste fallu quelques secondes pour me corriger. –

+0

poète: assez bien :) –

Questions connexes