Пружина JdbcTemplate
пример получения большого
Результирующего набора
P.S Протестирован с Java 8 и весенним ВЫПУСКОМ JDBC 5.1.4.
1. Получите большой результирующий набор
1.1 Ниже приведен классический findAll
для получения всех данных из таблицы.
public ListfindAll() { return jdbcTemplate.query( "select * from books", (rs, rowNum) -> new Book( rs.getLong("id"), rs.getString("name"), rs.getBigDecimal("price") ) ); }
Запустите его, для небольших данных, без проблем.
Listlist = bookRepository.findAll(); for (Book book : list) { //process it }
Если таблица содержит более миллионов данных, Сопоставитель строк
в Метод findAll
будет занят преобразованием объектов и помещением всех объектов в Список
, если размер объекта больше, чем пространство кучи Java, см. Ниже Ошибку:
java.lang.OutOfMemoryError: Java heap space
2. Решение
Мы можем увеличить размер кучи, но лучшим решением будет использовать RowCallbackHandler
для обработки большого Результирующего набора
для каждой строки.
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 } } });
Скачать Исходный Код
Рекомендации
- JAVADOCS с обратным вызовом для rowcallhandler
- Использование API потока Java 8 с JdbcTemplate Spring
- Весенние документы JDBC
- Примеры JDBC с пружинной загрузкой _
- Учебное пособие по Java JDBC
Оригинал: “https://mkyong.com/spring/spring-jdbctemplate-handle-large-resultset/”