2016-09-30 2 views
0

Я развернул некоторые приложения на сервере weblogic. Несколько дней назад, я проследил журналы и увидел сообщение об ошибке:JDBC Pool приостановлен, не может выделять ресурсы приложениям

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) 

Я думаю, что, имея приложение порей соединения и не возвращает их в бассейн

На временное решение, я должен продлил пул соединений. я пытаюсь исследовать, какие приложения сделали эту проблему и увидеть, что некоторые странные коды ниже:

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) будет используя код ниже, чтобы запросить данные однажды запросы:

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); 
    } 

Мое недоумение, которое я еще не понял:

  1. Использование статического соединения в нескольких потоках в порядке?

  2. Создайте новый класс (ConnectionHandler) для каждого запроса, а затем получите статическое соединение?

  3. Просто закройте соединение, не закрывая ResultSet, вызываемые сообщения?

Не могли бы вы помочь мне объяснить эти или какие-либо решения, чтобы предотвратить эту проблему?

ответ

1
  1. Метод static не результат его возвращения. static метод означает, что нет необходимости иметь экземпляр класса ограждающей называть его

  2. Да, это ошибка, но не такое большое дело

  3. Да, было бы лучше сначала закрыть результирующий набор, утверждение и связь, но это должно сделать работу

проблема с этим кодом является то, что нет в catch блоков нет conn.rollback() и могут быть неперехваченные исключения во время выполнения, что не будет откатить

+0

Hi @Boris, Как насчет контекста и источника данных выше? Можно ли начинать и искать каждый поток, когда мы получаем соединение? Или нам нужно реорганизовать как одноэлементный? Как известно, ConnectionHandler будет инициализироваться с первого запроса и вживую до тех пор, пока срок службы веб-службы. –

+0

Я бы рекомендовал использовать пул соединений JDBC вместо того, чтобы вручную назначать подключения: http://stackoverflow.com/a/2835570/32090 –