2016-04-07 29 views
-4

現在、私のコード(Java、Struts)に接続リークの問題があります。私はすべての結果セット、準備されたステートメント、呼び出し可能なステートメントと私のDAOのすべてのメソッドの最終ブロックの接続を閉じました。私は問題に直面しています。追加情報は、Oracleオブジェクトを作成するためにStructDescriptor.createDescriptorを使用しています。接続リークが発生しますか?お知らせ下さい。JDBC接続リーク

  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

をそして、あなたのコードはありますか? –

+0

編集時にコードを追加しました。 – lal1990

+0

私はリソースを試してみることを強くお勧めします。コード内のリソースを閉じた方法が漏れる可能性があります。 'updateStoredProc.close()'や 'pstmt1.close()'が例外をスローするとどうなるか考えてみてください。 –

答えて

2

あなたのコードのいくつかのヒントを以下のコード:

あなたはあなたの呼び出しにConnection変数を渡すが、あなたのコールの内側にそれを閉じるには - その事実を認識して、発信者ですか?あなたは例外をログに記録していない - - あなた'LLを無視しないで、

例外が捕捉されることを意図されている(メソッドを呼び出すと、責任がある)あなたのコードそれが閉じていない返す内部接続を取得するためにきれいになります何が起こるかわからない。私は単純なe.printStackTrace()あなたのキャッチブロックに役立つ情報を明らかにする賭けます。

使用try-with-resourcethis 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(); 
} 

非常に少なくとも単一のtry-catch内のすべての近くに置く:

} 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

ご回答ありがとうございましたJan、私は文と接続を閉じることを試みました。 2番目の方法。それでも接続リークの問題が発生しています。私のstandalone.xmlの最大プールで宣言された時間のメソッドを打つと、私は管理例外エラーを受け取りません。 – lal1990

+0

ログに例外が表示されますか? – Jan

+0

ああ - そこから多くのメソッドを呼び出して、接続としてパラメータとして渡します。あなたもそれらをチェックする必要があります(コードを共有する?) – Jan