首页 > 解决方案 > 为什么我的 java SQL 代码挂起而不抛出异常?

问题描述

我正在编写一个 java 应用程序的组件,它通过执行具有各种不同参数的 proc 从 sql 数据库中提取数据。这有时适用于需要能够运行数小时才能获得所需的所有数据的大型数据集。

我一直遇到我的程序似乎无限期挂起的问题。我在preparedStatement.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();

标签: javasqljdbc

解决方案


推荐阅读