2016-03-25 16 views
0

Bir MySQL veritabanında modellenen bir "Davet" nesnesine sahibim. Bu nesnenin bir listesi vardır ("treatmentPlanIDsToCopyf") ve veritabanında ikinci bir tablo ile korunur. Ana tabloya eklemek için yazdığım ve daha sonra listeden geçen ve listedeki her bir öğe için kayıtları ikinci tabloya eklediğim yöntem aşağıdadır. ps = cn.prepareStatement(sql); hattında Eclipse bana "Kaynak sızıntısı: 'ps' bu konumda kapalı değil" şeklinde bir uyarı veriyor. Hazırlanan deyimi finally maddesinde kapatıyorum, bu yüzden düzeltmem gereken bir kaynak sızıntısı olup olmadığını öğrenmek istedim. Bu, ilk defa hazırladığım ifadelerle parti kullanıyorum, bu yüzden emin değildim. Teşekkürler.aslında bu bir kaynak sızıntısı mı?

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); 
    } 

} 

cevap

4

Sızan ilk hazır bildiride olduğuna inanıyorum.

int success = ps.executeUpdate();'dan sonra, yeni hazırlanmış bir ifadeye değişkeni atamadan önce bu hazır deyimi kapatmanız gerekir.

İlgili konular