2016-09-30 1 views
0

일부 응용 프로그램을 weblogic 서버에 배포했습니다. 며칠 전, 나는 로그를 추적하여 오류 메시지를 보았다 :JDBC 풀이 일시 중단되었습니다. 응용 프로그램에 자원을 할당 할 수 없습니다.

2016-09-22 12:58:33,442 ERROR CommonService - ------- ERROR --------- java.sql.SQLException: Internal error: Cannot obtain XAConnection weblogic.common.resourcepool.ResourceDisabledException: Pool jdbc/*** is Suspended, cannot allocate resources to applications.. 
     at weblogic.common.resourcepool.ResourcePoolImpl.reserveResourceInternal(ResourcePoolImpl.java:377) 
     at weblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:342) 
     at weblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:329) 
     at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:417) 
     at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:324) 
     at weblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:94) 
     at weblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:63) 
     at weblogic.jdbc.jta.DataSource.getXAConnectionFromPool(DataSource.java:1677) 
     at weblogic.jdbc.jta.DataSource.refreshXAConnAndEnlist(DataSource.java:1475) 
     at weblogic.jdbc.jta.DataSource.getConnection(DataSource.java:446) 
     at weblogic.jdbc.jta.DataSource.connect(DataSource.java:403) 
     at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:364) 
     at [my-package].ConnectionHandler.newDatabaseConnection(ConnectionHandler.java:37) 

가 나는 응용 프로그램 부추 연결을 갖는 것은 임시 방편에 풀

에 반환하지 않는 생각을, 나는 확장에있다 연결 풀

if (connectionHandler == null) { 
     connectionHandler = new ConnectionHandler(); 
    } 

    try { 
     conn = connectionHandler.newDatabaseConnection(); 

     // Some callable statements here  

     conn.commit(); 

     logger.info("------- OK ---------"); 

    } catch (SQLException e) { 
     logger.error("------- ERROR ---------", e); 
    } catch (InstantiationException e) { 
     logger.error("------- ERROR ---------", e); 
    } catch (IllegalAccessException e) { 
     logger.error("------- ERROR ---------", e); 
    } catch (DossierServiceException e) { 
     logger.error("------- ERROR ---------", e); 
    } finally { 
     jdbc.close(conn); 
    } 

:

public class ConnectionHandler 
{ 
    .. 
    public ConnectionHandler() 
    { 
    logger.trace("ConnectionHandler() constructor called"); 
    } 

    static Connection newDatabaseConnection() throws SQLException 
    { 
    Connection conn; 
    try { 
     Context initContext = new InitialContext(); 
     DataSource dataSource = (DataSource) initContext.lookup(LOOKUP_URL); 
     conn = dataSource.getConnection(); 
     conn.setAutoCommit(false); 
    } catch (NamingException e) { 
     logger.error("------- ERROR ---------", e); 
     throw new ProcessingError("Could not obtain database connection!"); 
    } 
    return conn; 
    } 
} 

이 응용 프로그램 (SOAP 서비스)를 한 번 가진 요청을 데이터를 조회하려면 다음 코드를 사용합니다 : 나는이 문제를 만든 어떤 앱 연구하고 다음과 같은 몇 가지 이상한 코드가 있는지 시도 아직 이해가 안되는 내 혼란 :

  1. 멀티 스레드에서 정적 연결 사용은 괜찮습니까?

  2. 각 요청마다 새로운 클래스 (ConnectionHandler)를 생성 한 다음 정적 연결을 얻으시겠습니까?

  3. ResultSet, Callable 문을 닫지 않고 연결을 닫으시겠습니까?

이 문제에 대한 설명이나이 문제를 예방할 수있는 해결책이 있습니까?

답변

1
  1. 결과는 static이 아닙니다. static 방법은

  2. 네, 실수,하지만,하지 등 큰 문제가

  3. 네, 종료 첫번째 좋을 것이다 호출 할 둘러싸는 클래스의 인스턴스를 가질 필요는 없습니다 것을 의미합니다 결과 세트, 문 및 연결,하지만이 작업

을해야

이 코드의 문제는 catch 블록에는 conn.rollback()가 없습니다 다시

압연되지 않습니다 포착되지 않은 런타임 예외가있을 수 있다는 것이다
+0

안녕하세요 @ 보리스, 위의 컨텍스트 및 데이터 소스는 어떻습니까? 연결이 완료되면 각 스레드를 초기화하고 조회해도 괜찮습니까? 또는 싱글 톤으로 리팩토링해야합니까? 아시다시피 ConnectionHandler는 첫 번째 요청에서 초기화되며 웹 서비스 수명 동안 살아 있습니다. –

+0

수동으로 연결을 할당하는 대신 JDBC 연결 풀을 사용하는 것이 좋습니다. http://stackoverflow.com/a/2835570/32090 –