java - jdbctemplate 查询游标不在第一行之前
问题描述
我有以下代码。它只是执行一个查询然后导入到另一个数据库,第二部分与我的问题/问题无关。正如我默认看到的 jdbcTemplate.query()在第一个元素之前设置 Cursor 。我不知道我的错误在哪里,但是这段代码跳过了自光标初始状态@first 元素以来的第一行。所以当 while (resultSet.next()) { 开始它跳过第一个元素时......
我试图强行移动光标
resultSet.beforeFirst();
但它会引发错误。目前我在循环之前检查光标位置,我还考虑用 do {} while() 替换。
jdbcTemplate.query(sqlPull, resultSet -> {
List<List<Object>> batch = new ArrayList<>();
ResultSetMetaData metaData = resultSet.getMetaData();
int batchCount = 1;
int columnCount = metaData.getColumnCount();
if (resultSet.getRow() == 1) {
addAllColumnsToArray(resultSet, batch, columnCount);
}
while (resultSet.next()) {
addAllColumnsToArray(resultSet, batch, columnCount);
if (batch.size() >= 10000) {
callRestAPI(batch);
VaadinSqlApplication.logger.info("Commit batch: " + batchCount++);
insertTableToDb(sqlPush, push, batch);
batch.clear();
}
}
callRestAPI(batch);
VaadinSqlApplication.logger.info("Commit final batch. " + batchCount);
insertTableToDb(sqlPush, push, batch);
batch.clear();
});
……
private void addAllColumnsToArray(ResultSet resultSet, List<List<Object>> batch, int columnCount)
throws SQLException {
List<Object> row = new ArrayList<>();
for (int i = 1; i <= columnCount; i++) {
row.add(resultSet.getObject(i));
}
batch.add(row);
}
解决方案
你可以试试do{...}while()
// ...
do{
addAllColumnsToArray(resultSet, batch, columnCount);
if (batch.size() >= 10000) {
callRestAPI(batch);
VaadinSqlApplication.logger.info("Commit batch: " + batchCount++);
insertTableToDb(sqlPush, push, batch);
batch.clear();
}
}while(resultSet.next());
//...
推荐阅读
- java - @RestControllerAdvice 未实例化
- c# - 在异步任务中传输/访问局部变量 - API 控制器
- c# - 减小视频大小 Xamarin 表单
- c++ - grpc proto 文件生成到 C++ 问题
- c# - 如果没有新的选择,我如何编写更简单的代码?
- scripting - OWASP ZAP:启用脚本
- python - 单击鼠标添加数字?
- loopback4 - Loopback 4 如何在授权组件中访问请求授权令牌头
- python - Django:过滤日期之间的数据| DatetimeField 收到一个天真的日期时间
- html - 为什么 HTML 容器会继承 Body 子元素的所有属性和元素?