我正在尝试使用 Spring 和 JdbcTemplate 遍历 MySQL 中表的每一行。如果我没记错的话,这应该很简单:
JdbcTemplate template = new JdbcTemplate(datasource);
template.setFetchSize(1);
// template.setFetchSize(Integer.MIN_VALUE) does not work either
template.query("SELECT * FROM cdr", new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
System.out.println(rs.getString("src"));
}
});
我收到 OutOfMemoryError,因为它正在尝试读取整个内容。有什么想法吗?
最佳答案
这是一个基于 answer 的 Spring 解决方案由 BalusC 提供。
class StreamingStatementCreator implements PreparedStatementCreator {
private final String sql;
public StreamingStatementCreator(String sql) {
this.sql = sql;
}
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
final PreparedStatement statement = connection.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
statement.setFetchSize(Integer.MIN_VALUE);
return statement;
}
}
代码中的某处:
DataSource dataSource = ...;
RowCallbackHandler rowHandler = ...;
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.query(new StreamingStatementCreator("SELECT * FROM huge_table"), rowHandler);
关于java - 如何使用 Spring MySQL 和 RowCallbackHandler 管理大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2095490/