java - Spring JdbcTemplate 的可迭代结果
问题描述
Spring JdbcTemplate方便地将查询结果返回为单值、单行和集合。我的应用程序连续处理结果并且只处理一次,所以我不想加载不必要的内存。需要类似Iterator
. 试过这个:
try (ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("jdbc-context.xml")) {
DataSource dataSource = (DataSource) ctx.getBean("dataSource");
JdbcTemplate jоdbcTemplate = new JdbcTemplate(dataSource);
SqlRowSet rs = jоdbcTemplate.queryForRowSet("select rownum from dual connect by rownum <= ?", 15);
while(rs.next()) {
System.out.println(rs.getInt(1));
}
}
但似乎SqlRowSet
是 Java 标准ResultSet的断开版本,并且在实现中查询结果仍然是首先累积的。
JdbcTemplate
如何从无积累的情况下获得可迭代的一次性查询结果?
解决方案
正如@GPI 所建议的那样
try (ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("jdbc-context.xml")) {
DataSource dataSource = (DataSource) ctx.getBean("dataSource");
JdbcTemplate jоdbcTemplate = new JdbcTemplate(dataSource);
ResultSetExtractor<Boolean> rse = new ResultSetExtractor<Boolean>() {
@Override
public Boolean extractData(ResultSet rs) throws SQLException, DataAccessException {
while(rs.next()) {
System.out.println(rs.getInt(1));
}
return null;
}
};
jоdbcTemplate.query("select rownum from dual connect by rownum <= ?", new Integer[] {15}, rse);
}
至少它有效。似乎没有更自然的解决方案。可能会回到标准 JDBC 和ResultSet
.
解决方案
如果您不想在代码的“Spring 方面”累积任何内容,那么您最简单的选择是query
使用ResultSetExtractor
ResultSetExtractor 由 JDBCResultSet
提供,您可以从中进行迭代。
据我所知,没有办法拥有一个 Iterable 并且不以某种方式缓存 SQL 内容(iterables 可以根据调用者的需要重新创建尽可能多的迭代器,这意味着它必须能够“记住”所有内容)。
也就是说,SQL 驱动程序本身可能会或可能不会缓存内容,这是另一个讨论,与 Spring 无关。
您应该阅读 SQL 驱动程序的文档以寻找可能的优化(获取大小、仅向前滚动性等),如果需要,使用 SpringPreparedStatementCreator
更改 Spring 用于构建查询的 JDBC 选项。
推荐阅读
- android - 我得到了 Expected BEGIN_ARRAY 但在第 1 行第 2 列路径 $ 尝试使用 Retrofit 在 Android (java) 中获取 json 时是 BEGIN_OBJECT
- html - 将粉色 div 放在银色 div 后面,确保我们可以在完成后悬停粉色 div
- java - 如何从 jHipster 中的 SecurityContextHolder 检索自定义 UserDetails?
- c# - reader.EndOfStream 未检测到流的结尾
- swift - 为什么我的 Objective-C 块在传递给 Swift 函数时没有显示?
- meteor - 覆盖或禁用 DEFAULT_PASSWORD_ENROLL_TOKEN_EXPIRATION_DAYS?
- macos - 什么是英特尔 MKL 致命错误:无法加载 libmkl_core.dylib。在 MacOs 中运行 pyspark 时?
- html - 如何设置全角内容的最大宽度
没有单独的 元素? - python-3.x - AttributeError:“客户端”对象没有属性“命令”
- javascript - 如何修复:导致页面刷新的脚本(返回 false;不起作用)