2009-09-25 7 views
1

우리는 오라클 DB가있는 웹 스피어 (websphere) 상거래 사이트를 운영 중이고 DB 연결이 부족한 문제에 직면 해 있습니다. 준비된 명령문을 가져오고 연결을 처리하기 위해 JDBCHelper 싱글 톤을 사용하고 있습니다. 우리가 실행 한 후 가까운 자원 전달을위한 prepStmt.getConnection를 사용하여 연결을() 점점하려고 할 때JDBC 자원을 닫을 수 없습니다!

public static JDBCHelper getJDBCHelper() { 

       if (theObject == null){     
        theObject = new JDBCHelper(); 
       } 

     return theObject; 
} 
public void closeResources(Connection con, PreparedStatement pstmt, ResultSet rs){ 

     try{ 
      if(rs!=null){ rs.close();} 
     }catch(SQLException e){ 
      logger.info("Exception closing the resultset"); 
     }try{ 
      if(pstmt!=null) { pstmt.close(); } 
     }catch(SQLException e){ 
      logger.info("Exception closing the preparedstatement"); 
     }try{ 
      if(con!=null){ con.close(); } 

     }catch(SQLException e){ 
      logger.info("Exception closing the connection"); 
     } 
} 

그러나 그것은 SQL 예외가 발생합니다. 왜 그런가? 실행 후 즉시 연결이 닫힙니 까? 그리고 우리가 싱글 톤 JDBCHelper를 사용하는데있어 잘못된 점이 있습니까?

편집, 준비된 성명을 실행하고 연결

PreparedStatement pstmt = jdbcHelper.getPreparedStatement(query); 
try{ 
//rest of the code 
int brs = pstmt.executeUpdate(); 
} 

finally{ 
      try { 
       jdbcHelper.closeResources(pstmt.getConnection(),pstmt); 
      } catch (SQLException e1) { 
       logger.logp(Level.SEVERE,CLASS_NAME,methodName,"In the finally block - Could not close connection", e1); 
      } 
     } 
에게 종료 코드의

답변

1

에 대한 연결은 풀에서 가장 가능성이 올 것이다, 그것을 닫는 실제로 연결을 반환합니다 수영장 (덮개 아래). 나는 연결을 얻는 코드를 게시하고 그것을 사용하고 JDBCHelper를 통해 닫는 것이 더 유용 할 것이라고 생각한다.

Re. 당신의 싱글 톤, 나는 왜 이것을 사용하고 있는지 모르겠다. 아무 것도 가지고 있지 않기 때문에 영장 싱글 톤이된다. 체크 아웃은 Apache Commons DbUtils이 일종의 것들을 더 많은 외에 않습니다.

+0

감사합니다 ... 코드의 일부로 업데이트했습니다. – sarego

0

이 코드는 모든 동기화 코드가 없기 때문에 단일 스레드 작업에서만 작성된 것 같습니다. 예를 들어, getJdbcHelper() 메서드는 두 개의 JdbcHelper을 생성 할 수 있습니다. 실수가 아니라면, 주 스레드가 만든 후에 오랫동안 두 번째 스레드가 theObject를 볼 것이라는 보장조차 없습니다. 일반적으로 아키텍처에 따라 JVM이 실행됩니다.

웹 서버에서 실행중인 경우 두 스레드가 동시에 연결을 수정하는 경주 문제가 발생할 수 있습니다. 자신의 연결 풀이나 다른 것을 굴리지 않는 한.

브라이언이 맞습니다.이 어려운 문제를 해결할 수있는 무료 라이브러리 중 하나를 사용하십시오.

관련 문제