java - 为什么我的 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();
解决方案
推荐阅读
- java - AWS Java SDK SQSlistener 端点问题
- c++ - 为什么将 std::lock 放在 std::lock_guard 之前
- ruby - 如何在 ruby 中根据 UUID 生成 UTID?
- sql-server - 使用多行从 vb.net 更新存储过程
- scala - 在 Spark 中优化分区数据
- python - [-2:] 和 [2:] 有什么区别?
- javascript - mongoDB 集合中的 Meteor 新字段在 js 文件中有效,但在 html 模板中无效
- algorithm - 在图中查找指定边
- typo3 - TYPO3 自己的扩展详细信息页面,带有表单和计数器
- selenium - 在 Selenium Grid 中使用无头 Chrome 进行测试