2014-10-11 12 views
0

아래 메소드가있는 DAO 클래스가 있습니다. 나는 이것을 트랜잭션 관리자 내부에서 호출한다. "conn.commit()"줄을 사용하지 않고 실행했을 때 - 타임 아웃 예외가 발생하지만 이걸로 실행하면 괜찮습니다. 뭐가 문제 야? db를 수정하지 않으면 커밋 할 필요가 없다는 것을 알고 있습니다. commit() 전화로보고커밋없이 connection throw timeoutException이 발생했습니다.

@Override 
    public List<String> getLinks(int id) throws SQLException { 
     List<String> list = new ArrayList<>(); 
     Connection conn = factory.newConnection(); 
     Statement statement = null; 
     ResultSet rs = null; 
     try { 
      String expression = "select link from users.links where id=" + id + " order by id_link desc"; 
      statement = conn.createStatement(); 
      rs = statement.executeQuery(expression); 
      while (rs.next()) { 
       list.add(rs.getString("link")); 
      } 
      // !!!!!!!!!!!!! without next line method throw TimeoutException 
      conn.commit(); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
      // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
      return list; 
     } catch (SQLException e) { 
      rollBackQuietly(conn); 
      e.printStackTrace(); 
     } finally { 
      closeQuaitly(rs); 
      closeQuaitly(statement); 
      closeQuaitly(conn); 
     } 
     return null; 
    } 
+0

여기서 TimeoutException이 발생합니까? – jtahlborn

+0

"rs = statement.executeQuery (expession)"줄이 나옵니다. – Paul

답변

0

는 예외를 던지고 선 후,이 문제가 후 (귀하의 질문에 포함 유용한 정보)이 메소드의 호출을 반복 와야 입니다. 이것은 Connection 팩토리가 Connections를 재사용하고 있고, "오래된"연결 (너무 오랫동안 앉아 있고 더 이상 사용할 수없는 연결)을 나눠주고 있다고 믿게 만듭니다. 이 모든 것이 사실이라면 공장에서 Connections를 더 잘 관리 할 필요가 있습니다. 합리적으로 구축 된 연결 풀인 경우 "유휴 상태에서 테스트"또는 사용하도록 설정해야하는 "테스트 중"과 같은 기능이있을 것입니다.