Я развернул некоторые приложения на сервере 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);
}
Мое недоумение, которое я еще не понял:
Использование статического соединения в нескольких потоках в порядке?
Создайте новый класс (ConnectionHandler) для каждого запроса, а затем получите статическое соединение?
Просто закройте соединение, не закрывая ResultSet, вызываемые сообщения?
Не могли бы вы помочь мне объяснить эти или какие-либо решения, чтобы предотвратить эту проблему?
Hi @Boris, Как насчет контекста и источника данных выше? Можно ли начинать и искать каждый поток, когда мы получаем соединение? Или нам нужно реорганизовать как одноэлементный? Как известно, ConnectionHandler будет инициализироваться с первого запроса и вживую до тех пор, пока срок службы веб-службы. –
Я бы рекомендовал использовать пул соединений JDBC вместо того, чтобы вручную назначать подключения: http://stackoverflow.com/a/2835570/32090 –