JDBC 池已暂停,无法为应用程序分配资源

JDBC Pool is suspended, , cannot allocate resources to applications

我在 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)

我认为拥有一个应用程序会增加人脉关系,但不会 return 他们进入池子

临时解决方案,我必须扩展连接池。 我尝试研究哪些应用程序造成了这个问题,并在下面看到了一些奇怪的代码:

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. 为每个请求创建新的class(ConnectionHandler)然后获取静态连接?

  3. 只关闭连接而不关闭ResultSet,Callable语句?

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

  1. 该方法 static 不是它返回的结果。 static 方法意味着不需要包含 class 的实例来调用它

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

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

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