2016-04-07 12 views
-4

Ich bin derzeit konfrontiert Verbindung Leck Problem in meinem Code (Java, Struts). Ich habe alle Ergebnismengen, vorbereiteten Anweisungen, aufrufbaren Anweisungen und die Verbindung in den Endblocks aller Methoden in meinem Dao geschlossen. Trotzdem habe ich das Problem.Weitere Informationen sind, ich benutze StructDescriptor.createDescriptor zum Erstellen von Oracle-Objekten. Wird es irgendwelche Verbindungslecks verursachen? Bitte beraten.JDBC-Verbindung Leck

-Code unten

  public boolean updatedDetails(Distribution distribution, String appCode, Connection dbConnection) { 
    boolean savedFlag = true; 
    CallableStatement updateStoredProc = null; 
    PreparedStatement pstmt1 = null; 
    try { 
     logger.debug("In DistributionDAO.updatedDistributionDetails"); 
     //PreparedStatement pstmt1 = null; 
     ARRAY liArray = null; 
     ARRAY conArray = null; 
     ARRAY payArray = null; 
    ArrayDescriptor licenseeArrDesc = ArrayDescriptor.createDescriptor(LICENSEE_TAB, dbConnection); 
     ArrayDescriptor contractArrDesc = ArrayDescriptor.createDescriptor(DISTRIBUTION_CONTRACT_TAB, dbConnection); 
     ArrayDescriptor paymentArrDesc = ArrayDescriptor.createDescriptor(DISTRIBUTION_PAYMENT_TAB, dbConnection); 
     licenseeArray = new ARRAY(licenseeArrDesc, dbConnection, licenseeEleList.toArray()); 
      contractArray = new ARRAY(contractArrDesc, dbConnection, contractEleList.toArray()); 
      paymentArray = new ARRAY(paymentArrDesc, dbConnection, paymentEleList.toArray());   
      updateStoredProc = dbConnection.prepareCall("{CALL DIS_UPDATE_PROC(?,?,to_clob(?),?,?,?,?)}"); 
      updateStoredProc.setLong(1, distribution.getDistributionId()); 
      updateStoredProc.setString(2, distribution.getId()); 
      updateStoredProc.setString(3, distribution.getNotes()); 
      updateStoredProc.setString(4, distribution.getNotesUpdateFlag()); 
      updateStoredProc.setArray(5, liArray); 
      updateStoredProc.setArray(6, conArray); 
      updateStoredProc.setArray(7, payArray); 
      String sql1="Update STORY set LAST_UPDATE_DATE_TIME= sysdate WHERE STORY_ID = ? "; 
      pstmt1=dbConnection.prepareStatement(sql1); 
      pstmt1.setLong(1,distribution.getStoryId()); 
      pstmt1.execute(); 
      List<Object> removedEleList = new ArrayList<Object>(); 
      removedEleList.add(createDeleteElementObject(removedEle, dbConnection)); 
      catch (SQLException sqle) { 
     savedFlag = false; 

    } catch (Exception e) { 
     savedFlag = false; 

    } finally { 
     try { 
      updateStoredProc.close(); 
      updateStoredProc = null;    
      pstmt1.close(); 
      pstmt1 = null;  
      dbConnection.close(); 
     } catch (SQLException e) { 

     } 
    } 
    return savedFlag; 
} 




// Method createDeleteElementObject 
private Object createDeleteElementObject(String removedEle, 
     Connection connection) { 

    StructDescriptor structDesc; 
    STRUCT structObj = null; 
    try { 
     structDesc = StructDescriptor.createDescriptor(DISTRIBUTION_REMOVED_ELEMENT_OBJ, connection); 
     if(removedEle != null) { 
      String[] tmpArr = removedEle.split("\\|"); 
      if(tmpArr.length == 2) { 
       Object[] obj = new Object[2]; 
       String eleType = tmpArr[0]; 
       long eleId = Integer.parseInt(tmpArr[1]); 
       obj[0] = eleType.toUpperCase(); 
       obj[1] = eleId; 
       structObj = new STRUCT(structDesc, connection, obj); 
      } 
     } 
    } catch (ArrayIndexOutOfBoundsException e) { 

    } catch (NumberFormatException e) { 

    } catch (SQLException e) { 

    } 

    return structObj; 
}  
+3

Und wo ist der Code? –

+0

Ich habe den Code in Bearbeitung hinzugefügt. – lal1990

+0

Ich schlage vor, dass Sie auf Ressourcen umsteigen. Die Art, wie Sie Ressourcen in Ihrem Code geschlossen haben, kann undicht werden. Überlegen Sie, was passiert, wenn 'updateStoredProc.close()' oder 'pstmt1.close()' eine Ausnahme auslöst. –

Antwort

2

Einige Hinweise auf Ihren Code:

Sie übergeben eine Connection Variable in Ihren Anruf aber in Ihrem Anruf in der Nähe - ist der Anrufer sich dessen bewusst? Es wäre sauberer die Verbindung in Ihrem Code zu bekommen oder Rückkehr es nicht geschlossene (Aufruf der Methode verantwortlich ist)

Ausnahmen sollen gefangen werden, nicht ignoriert - Sie Ihre Ausnahme nicht anmelden - Sie werden Ich weiß nie was passiert. Ich wette, eine einfache e.printStackTrace() in Ihren Catch-Blöcken wird nützliche Informationen offenbaren.

Verwenden try-with-resource (siehe this post)

//Resources declared in try-with-resource will be closed automatically. 
try(Connection con = getConnection(); 
    PreparedStatement ps = con.prepareStatement(sql)) { 

    //Process Statement... 

} catch(SQLException e) { 
    e.printStackTrace(); 
} 

Am allerwenigsten alle dicht innerhalb einzelner try-catch setzen:

} finally { 
    try { 
     if(updateStoredProc != null) { 
      updateStoredProc.close(); 
     }   
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    try { 
     if(pstmt1!= null) { 
      pstmt1.close(); 
     }   
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    try { 
     if(dbConnection != null) { 
      dbConnection.close(); 
     }   
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    } 
+0

Vielen Dank für Ihre Antwort Jan, ich habe versucht, die Aussagen und Verbindungen durch die zweite Methode. Trotzdem bekomme ich das Problem mit dem Verbindungsleck. Nachdem ich die Anzahl der in meinem Standalone.xml maximalen Pool deklarierten Zeiten erreicht habe, erhalte ich keinen verwalteten Exceptions Fehler. – lal1990

+0

Sie sehen Ausnahmen in Ihrem Protokoll? – Jan

+0

Oh - und Sie rufen viele Methoden von dort die Verbindung als Parameter übergeben. Sie müssen sie auch überprüfen (teilen Sie den Code?) – Jan