Spring JdbcTemplate example to get a large ResultSet and process it.
P.S Tested with Java 8 and Spring JDBC 5.1.4.RELEASE
1. Get large ResultSet
1.1 Below is a classic findAll to get all data from a table.
BookRepository.java
public List<Book> findAll() {
return jdbcTemplate.query(
"select * from books",
(rs, rowNum) ->
new Book(
rs.getLong("id"),
rs.getString("name"),
rs.getBigDecimal("price")
)
);
}
Run it, for small data, no problem.
List<Book> list = bookRepository.findAll();
for (Book book : list) {
//process it
}
If the table contains over millions of data, the RowMapper in findAll method will busy converting objects and put all objects into a List, if the object size is larger than the Java heap space, see below error:
java.lang.OutOfMemoryError: Java heap space
2. Solution
We can increase the heap size, but a better solution is to use RowCallbackHandler to process the large ResultSet on a per-row basis.
import org.springframework.jdbc.core.RowCallbackHandler;
jdbcTemplate.query("select * from books", new RowCallbackHandler() {
public void processRow(ResultSet resultSet) throws SQLException {
while (resultSet.next()) {
String name = resultSet.getString("Name");
// process it
}
}
});
Download Source Code
$ git clone https://github.com/favtuts/java-spring-boot-tutorials.git
$ cd spring-jdbc