일부 응용 프로그램을 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 서비스)를 한 번 가진 요청을 데이터를 조회하려면 다음 코드를 사용합니다 : 나는이 문제를 만든 어떤 앱 연구하고 다음과 같은 몇 가지 이상한 코드가 있는지 시도 아직 이해가 안되는 내 혼란 :
멀티 스레드에서 정적 연결 사용은 괜찮습니까?
각 요청마다 새로운 클래스 (ConnectionHandler)를 생성 한 다음 정적 연결을 얻으시겠습니까?
ResultSet, Callable 문을 닫지 않고 연결을 닫으시겠습니까?
이 문제에 대한 설명이나이 문제를 예방할 수있는 해결책이 있습니까?
안녕하세요 @ 보리스, 위의 컨텍스트 및 데이터 소스는 어떻습니까? 연결이 완료되면 각 스레드를 초기화하고 조회해도 괜찮습니까? 또는 싱글 톤으로 리팩토링해야합니까? 아시다시피 ConnectionHandler는 첫 번째 요청에서 초기화되며 웹 서비스 수명 동안 살아 있습니다. –
수동으로 연결을 할당하는 대신 JDBC 연결 풀을 사용하는 것이 좋습니다. http://stackoverflow.com/a/2835570/32090 –