为什么我的Java SQL代码挂起而没有引发异常?

时间:2019-01-30 15:59:30

标签: java sql jdbc

我正在编写Java应用程序的组件,该组件通过执行具有各种不同参数的proc将数据从sql数据库中拉出。有时,这是为了在大型数据集上工作,该数据集将需要运行几个小时才能获取所需的所有数据。

我一直遇到一个问题,我的程序似乎无限期挂起。我已经看到这同时发生在prepareStatement.execute()和resultSet.next()上。它不会引发任何异常,只是挂在那一行。

尝试进行通宵测试时,我主要遇到了这个问题,这使其成本高且难以复制。我看到了一个类似的问题,我的连接在执行过程中被丢弃,并引发了异常,但是我能够修改代码以在发生这种情况时重新连接。

这是我运行proc并解析结果的代码,该proc返回4个结果集,以便对此进行处理。悬挂似乎总是发生在这里的某个地方。

final String sql = "EXEC " + "procname" + " ?";
final PreparedStatement preparedStatement = connection.connection.prepareStatement(sql);
preparedStatement.setString(1, phrase);
preparedStatement.setQueryTimeout(30);
boolean resultsRemaining = preparedStatement.execute();
if (resultsRemaining) {
    while (resultsRemaining) {
        final ResultSet resultSet = preparedStatement.getResultSet();
        final boolean resultsEmpty = !resultSet.next();
        for (LearnableAttribute la : LearnableAttribute.values()) {
            final String dbName = la.getDbName().toUpperCase();
            final ResultSetMetaData metaData = resultSet.getMetaData();
            for (int i = 0; i < metaData.getColumnCount(); i++) {
                final String colName = metaData.getColumnName(i + 1);
                if (colName.toUpperCase().equals(dbName)) mad.map.put(la, resultsEmpty ? null : resultSet.getString(la.getDbName()));
            }
        }
        resultsRemaining = preparedStatement.getMoreResults();
        resultSet.close();
    }
    if (LearnableAttribute.values().length != mad.map.size()) throw new RuntimeException();
    mad.map.put(LearnableAttribute.CLASS_ATTRIBUTE, classValue);
} else throw new RuntimeException();
preparedStatement.close();

0 个答案:

没有答案