2017-11-22 30 views
0

Tomcat 연결 풀 오류로 고민하고 있습니다. 런타임 오류 값은 문자열 값을 생성하는 간단한 저장 프로 시저를 실행 한 후에 발생합니다.Tomcat 연결 풀 버려진 문제

WARNING: Connection has been abandoned PooledConnection[ConnectionID:45 ClientConnectionId: 7817280c-3f7e-4239-a009-3aedd0a855e8]:java.lang.Exception 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1096) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:799) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:648) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:200) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128) 
    at util.ThreadLocalUtil.getConnection(ThreadLocalUtil.java:55) 
    at webapp.dao.WebApplicationDAO.getConnection(WebApplicationDAO.java:30) 
    at webapp.dao.AccountDAO.generateAccountId(AccountDAO.java:827) 
    at webapp.bo.Account.generateUserAccountId(Account.java:285) 
    at webapp.actions.AddUserAccountUNZAction.execute(AddUserAccountUNZAction.java:79) 
    at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58) 
    at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67) 
    at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) 

해당 오류에 대한 지식은 연결이 열렸지만 닫히지 않았 음을 나타냅니다. 계정 dao에서 저장된 proc을 실행할 때 연결이 열립니다. 아래는 저장 프로 시저를 호출하는 코드 블록입니다. 당신이 볼 수 있듯이

Connection conn = null; 
    CallableStatement stmt = null; 
    ResultSet rs = null; 
    try { 

     conn = getConnection(); 
     stmt = conn.prepareCall(sqlWebAppGenerateUserId); 
     stmt.setString(1, base); 
     rs = stmt.executeQuery(); 
     String res = null; 
     if (rs.next()) { 
      res = rs.getString(1); 
     } 

     if (res == null) { 
      throw new RuntimeException("Failed to generate user id."); 
     } 

     return res; 
    } catch (SQLException e) { 
     LOG.error("{}", e); 
     throw new RuntimeException(e); 
    }finally { 
     if (stmt != null) { 
      try { 
       stmt.close(); 
      } catch (SQLException e) { 
       LOG.error(e.getMessage(), e); 
      } 
     } 
     if (rs != null) { 
      try { 
       rs.close(); 
       conn.close(); 
      } catch (SQLException e) { 
       LOG.error(e.getMessage(), e); 
      } 
     } 

    } 

것은, 나는 마침내 연결을 닫습니다 차단 사용하고 등

나는 오류가 어떻게 아직도하고 발생되는 이유를 설명하기 위해 손실에 있어요 디버깅하여이 문제를 해결할 수 있습니다. 어떤 도움을 주시면 감사하겠습니다.

+0

우선, 사용하기 시작 [시도 -과 - 자원 (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html). 그렇게 한 후에도 여전히 문제가 있으면 새로운 질문을 게시하십시오. –

답변

0

@ 카야 만 및 @Gorazd 조언 해 주셔서 감사합니다. tomcat lib 폴더의 jar 파일이 누락되었습니다. 보다 구체적으로 mail-1.4.jar.

이 jar 파일이 누락되어 이메일을 보내는 함수가 실패했습니다. 메일을 보내기 전에는 connection.autocommit이 true로 설정됩니다. 메일이 보내지면 autocommit이 false로 다시 설정됩니다. 이것은 내게있어 버려진 오류가 어디서 발생했는지와 같습니다.

로그 파일을 살펴볼 때 메일 전송 오류가 발견되었습니다. 버려진 오류가 붉은 청어로 보일 수있는 반면 실제로 이것은 사실 진정한 오류입니다.

1

rs != null 인 경우에만 conn을 닫습니다. 즉, 쿼리가 실패 할 때마다 연결이 닫히지 않습니다.

또한 try-with-resources로 전환하는 대신 버그의 원인이 서투른 마지막 블록을 작성하는 것이 좋습니다.

0

@ 카야 만이 말한 바. 또한 명령문 실행이 removeAbandonedTimeout보다 오래 걸리는 경우 이런 일이 발생할 수 있습니다.