我有Servlet,可在json中返回数据。我尝试循环执行一些查询。如果查询数组包含的查询少于5个,则效果很好。但是,如果我尝试在循环中执行10个查询,它将堆积并返回NullPointerExceprion。
这是我的代码

private JSONArray getQueryResultJSONById(String queryId, String formName, JSONObject paramsJSON) {
String sql = getQuery(queryId, formName);
if (sql != null) {
    try {
        Connector connector = new Connector(Defaults.DS_DEFAULT);
        connector.prepareStatement(sql);
        connector.setPreparedJSONParams(paramsJSON);
        connector.executePrepared();
        JSONArray dbrs = ResultSetConverter.convertToJSON(connector.getPreparedSelect());
        connector.close();
        return dbrs;
    } catch (Exception e) {
        e.printStackTrace();
    }
}
return null;
}


连接器类别:

public void prepareStatement(String query) {
    try {
        this.sql = query;
        if (connection.isClosed()) {
            connection = dataSource.getConnection();
        }
        preparedStatement = connection.prepareStatement(query);
    } catch (Exception e) {
        logException(e);
    }
}
public void setPreparedJSONParams(JSONObject paramsJSON) {
    if (paramsJSON != null) {
        JSONArray array = paramsJSON.getJSONArray("params");
        for (int i = 0; i < array.length(); i++) {
            String paramValue = array.getString(i);
            if (NULL.equals(paramValue)) {
                setPreparedParam(i + 1, (String) null);
            } else {
                setPreparedParam(i + 1, array.getString(i));
            }
        }
    }
}
public boolean executePrepared() {
    try {
        preparedStatement.executeUpdate();
        return true;
    } catch (Exception e) {
        logException(e);
        return false;
    }
}
public ResultSet getPreparedSelect() {
    ResultSet resultSet = null;
    try {
        resultSet = preparedStatement.executeQuery();
    } catch (Exception e) {
        logException(e);
    }
    return resultSet;
}
public void close() {
    try {
        if (statement != null) {
            statement.close();
        }
        if (connection != null) {
            connection.close();
        }
        if (preparedStatement != null) {
            preparedStatement.close();
        }
    } catch (Exception e) {
        logException(e);
    }
}


在循环中,我尝试这样做来执行查询:

queryRs = new JSONArray(uiQueryService.getQueryResultById(querys.get(i), "REPORT", params.toString()));


我尝试在此地方进行调试,以查看哪个请求产生了问题,但是在调试器中,每个请求均运行良好,并且结果成功返回。我不知道如何解决问题

例外:

J2CA0045E: Во время вызова метода createOrWaitForConnection для ресурса jdbc/Oep/NonXaDataSourceWeb соединение недоступно.
[18.03.19 13:08:33:025 MSK] 0000f40e TaskUtils$Log E org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler handleError Unexpected error occurred in scheduled task.
                                 org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.ibm.websphere.ce.cm.ConnectionWaitTimeoutException: CWTE_NORMAL_J2CA1009
                at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:243)
                at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
                at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:420)
                at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:257)
                at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
                at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
                at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
                at com.sun.proxy.$Proxy158.pollDiagnosisLock(Unknown Source)
                at sun.reflect.GeneratedMethodAccessor209.invoke(Unknown Source)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56)
                at java.lang.reflect.Method.invoke(Method.java:620)
                at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
                at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
                at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
                at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:483)
                at java.util.concurrent.FutureTask.run(FutureTask.java:274)
                at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:190)
                at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1157)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:627)
                at java.lang.Thread.run(Thread.java:809)
Caused by: com.ibm.websphere.ce.cm.ConnectionWaitTimeoutException: CWTE_NORMAL_J2CA1009
                at com.ibm.ws.rsadapter.AdapterUtil.toSQLException(AdapterUtil.java:1680)
                at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:661)
                at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:611)
                at sun.reflect.GeneratedMethodAccessor41.invoke(Unknown Source)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56)
                at java.lang.reflect.Method.invoke(Method.java:620)
                at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
                at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:198)
                at com.sun.proxy.$Proxy123.getConnection(Unknown Source)
                at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:205)
                ... 20 more
Caused by: com.ibm.websphere.ce.j2c.ConnectionWaitTimeoutException: CWTE_NORMAL_J2CA1009
                at com.ibm.ejs.j2c.FreePool.createOrWaitForConnection(FreePool.java:1783)
                at com.ibm.ejs.j2c.PoolManager.reserve(PoolManager.java:3874)
                at com.ibm.ejs.j2c.PoolManager.reserve(PoolManager.java:3094)
                at com.ibm.ejs.j2c.ConnectionManager.allocateMCWrapper(ConnectionManager.java:1548)
                at com.ibm.ejs.j2c.ConnectionManager.allocateConnection(ConnectionManager.java:1031)
                at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:644)
                ... 28 more

最佳答案

感觉就像连接用尽了。

connection.close()中有两个错误:您需要关闭准备好的语句,该语句然后关闭连接(创建这些资源的相反顺序)。

可能其中之一引发异常,然后连接永远不会关闭。因此,请在日志中查找更多错误,并使用以下代码:

if (x != null) {
    try { x.close(); } catch(Exception e) { log.warn("Failed to close X", e); }
}


也就是说,每次调用close()都要处理异常,因此其他资源也会被关闭。

如果仍不能解决问题,请查看Connector的使用和设计方式。通常,一个应用程序只能同时创建到数据库的几个(大约10个)连接。因此,应用程序使用一个连接池来处理创建和关闭连接。当您请求新的连接时,您将在池中获得一个代理。这意味着每个真实的JDBC连接在关闭之前都会用于许多SQL语句和查询。

这样,应用程序就无法通过打开数千个昂贵的连接来使数据库挨饿,而仍然使用简单的“打开/关闭连接”设计。

关于java - Websphere jdbc连接不可用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55218758/

10-10 19:52