2014-09-22 1 views
0

열기 및 닫기 함수가 수동으로 결합되었지만 DataSource에서 연결을 열 때 GlassFish에서 최대 풀 크기 예외가 발생했습니다. 나는 모든 곳에서 구글을 찾을 수 있지만 대답은 없다! 누구도 도와 줄 수 있습니까?DataSource에서 연결을 닫을 수 없기 때문에 GlassFish에서 최대 풀 크기 예외가 발생했습니다.

(내 설정 초기 연결 풀 : 8, 최대 풀 크기 : 32, 유휴 시간 제한 : 300s, 최대 대기 시간 : 60) 통화 작업시 예외가되는 최대 풀 크기) 함수

public class BP{ 

    @Resource(name="BP", type = javax.sql.DataSource.class) 

    private DataSource ds; 



    public void work(){ 
     for(int i = 0; i < 50; i++){ 
      doSomething(); 
     } 
    } 
    public void doSomething(){ 
     java.sql.Connection conn = null;   
     CallableStatement cs = null; 
     ResultSet rs = null;   
     try{ 
      conn = ds.getConnection(); 
      cs = conn.prepareCall("{ call get_bank(?,?) }"); 
      cs.setString(1, "test"); 
      cs.registerOutParameter(2, OracleTypes.CURSOR);   
      cs.execute(); 
      rs = (ResultSet) cs.getObject(2);/ 

      // do something 
      //...  
     } catch (Exception e) {    
      e.printStackTrace(); 
     }finally{ 
      if (rs != null) { 
       try { 
       rs.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

      if (cs != null) { 
       try { 
       cs.close(); 
       } catch (Exception e) { 
       e.printStackTrace(); 
       } 
      } 

      if (conn != null) { 
       try { 
       conn.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }  
    } 
} 

OUPUT :

Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: In-use connections equal max-pool-size and expired max-wait-time. Cannot allocate more connections. 
+0

'e.printStackTrace()'는 work()를 호출 할 때 발생하는 오류보다 자세하게 표시해야합니다. 아마'ds.getConnection()'을 호출했을 것입니다. 코드에'ds '를 초기화하는 방법이 표시되지 않으므로 여기에 문제가있을 수 있습니다. –

+0

감사의 말 Simo, 출력 : "내부 예외 : java.sql.SQLException : 연결 할당 오류 원인 : 사용중인 연결 수가 최대 풀 크기와 만료 된 최대 대기 시간이며 더 많은 연결을 할당 할 수 없습니다." ds 변수는 "@Resource (name ="BP ", type = javax.sql.DataSource.class)에 의해 풀에서 참조됩니다." –

+0

모니터링 연결에서 32 개의 연결이 고갈 된 모니터링 웹 페이지의 연결 수가 표시됩니다. 아마도 글래스 피시는 connnection.close() 함수를 호출했지만 실제로 연결을 해제하지 않습니다! –

답변

0

당신의 마지막 문장의 마지막 블록은 아마 당신의 문제입니다.

.close()()은 conn이 아닙니다. 의미가 잘못된 개체를 참조하고 있습니다.

if (conn != null) { 
     try { 
      connection.close(); <---- should be conn.close() 
     } catch (Exception e) { 
       e.printStackTrace(); 
     } 
} 
+0

예, 예제에서 실수가 있으므로 예제 소스를 수정했습니다! 그러나 문제는 여전히 존재합니다. 어떤 해결책을 찾아 낼 수 있습니까? 감사합니다 –

+0

@ GoldenMan 당신이 제공 한대로, 나는 더 이상의 문제를 볼 수 없습니다. doSomething()을 하나씩 디버깅 할 수 있습니까? –

+0

안녕하세요, Simo 님, 지원해 주셔서 감사합니다. 한 줄씩 디버깅을하면 아마도 문제가 나타나지 않을 것입니다. 문제 (최대 풀 크기 예외)는 소스에 중단 점을 표시하지 않고 work() 함수를 실행하면 나타납니다. –

관련 문제