gpt4 book ai didi

java - JDBC Pool 已挂起,无法为应用程序分配资源

转载 作者:行者123 更新时间:2023-12-01 09:26:33 25 4
gpt4 key购买 nike

我在 weblogic 服务器中部署了一些应用程序。前几天,我跟踪日志,看到了错误信息:

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、Callable语句?

你能帮我解释一下这些问题或者有其他解决方案来防止这个问题吗?

最佳答案

  1. 该方法是静态,而不是它返回的结果。 静态方法意味着不需要有封闭类的实例来调用它

  2. 是的,这是一个错误,但是,没什么大不了的

  3. 是的,最好先关闭结果集、语句和连接,但这应该可以完成工作

这段代码的问题在于,catch block 中没有conn.rollback(),并且可能存在未捕获的运行时异常,不会回滚

关于java - JDBC Pool 已挂起,无法为应用程序分配资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39786297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com