java - 如何使用 Spring MySQL 和 RowCallbackHandler 管理大型数据集

标签 java mysql spring jdbc

我正在尝试使用 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/

相关文章:

java - 条件 vs 等待通知机制

java - 删除二叉树中的值

php - mysql 和 mysqli 的问题

java - JPA错误: InvalidDataAccessApiUsageException: detached entity passed to persist

java - 用 Maven 解决 jar 问题?

java - 如何在 hibernate 中渲染具有多个表的树结构?

mysql - 如何动态更改where子句中的列?

php - 提交PHP mysql后如何编辑数据库信息并保留表单中的值

spring - 如何在Spring Boot中设置enableLoggingRequestDetails ='true'

java - 如何解决错误 : java. sql.SQLException : No suitable driver in spring security?