2016-03-25 8 views
0

Ich habe ein "Einladung" -Objekt, das in einer MySQL-Datenbank modelliert ist. Dieses Objekt hat eine Liste ("treatmentPlanIDsToCopyf") und wird in der Datenbank mit einer zweiten Tabelle gepflegt. Die Methode, die ich geschrieben habe, um sie in die Haupttabelle einzufügen und dann durch die Liste zu gehen und Datensätze für jedes Element in der Liste in die zweite Tabelle einzufügen, ist unten. An der Leitung ps = cn.prepareStatement(sql); Eclipse gibt mir eine Warnung, die besagt: "Ressourcenverlust: 'PS' ist nicht an diesem Ort geschlossen". Ich schließe die vorbereitete Aussage in der finally-Klausel, also wollte ich wissen, ob es wirklich ein Ressourcenleck gibt, das ich beheben muss. Dies ist das erste Mal, dass ich Chargen mit vorbereiteten Anweisungen verwende, also war ich mir nicht wirklich sicher. Vielen Dank.ist das eigentlich ein Ressourcenleck?

public void invitationCreate(Connection cn, Invitation invitation) throws SQLException{ 

    PreparedStatement ps = null; 

    try { 
     //first insert primary invitation data into the invitation table 
     String sql = "INSERT INTO invitiation (invitation_code, recipient_email, sender_user_id_fk, date_intived, date_accepted, accepted, recipient_first_name, recipient_last_name) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; 

     ps = cn.prepareStatement(sql); 

     ps.setString(1, invitation.getInvitationCode()); 
     ps.setString(2, invitation.getRecipientEmail()); 
     ps.setInt(3, invitation.getSenderUserID()); 
     ps.setTimestamp(4, convertLocalTimeDateToTimstamp(invitation.getDateInvited())); 
     ps.setTimestamp(5, convertLocalTimeDateToTimstamp(invitation.getDateAccepted())); 
     ps.setBoolean(6, invitation.isAccepted()); 
     ps.setString(7, invitation.getRecipientFirstName()); 
     ps.setString(8, invitation.getRecipientLastName()); 

     int success = ps.executeUpdate(); 

     //now loop through all the treatmentPlanIDs in the invitation that are to be copied into the invitees account when the register 

     sql = "INSERT INTO invitation_treatment_plans (invitation_code_fk, invitation_treatment_plan_id_fk) VALUES (?, ?)"; 

     ps = cn.prepareStatement(sql);//TODO confirm this if this is actually a resource leak 

     for(int treatmentPlanID : invitation.getTreatmentPlanIDsToCopy()){ 
      ps.setString(1, invitation.getInvitationCode()); 
      ps.setInt(2, treatmentPlanID); 

      ps.addBatch(); 
     } 

     ps.executeBatch(); 

    } finally { 
     DbUtils.closeQuietly(ps); 
    } 

} 

Antwort

4

Ich glaube, das Leck ist in der ersten vorbereiteten Aussage.

Nach int success = ps.executeUpdate(); müssen Sie diese vorbereitete Anweisung schließen, bevor Sie die Variable einer neuen vorbereiteten Anweisung zuweisen.

Verwandte Themen