我正在编写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();