Получить большие данные более 200 МБ из дБ JdbcTemplate - PullRequest
0 голосов
/ 09 ноября 2018

Есть ли лучший способ извлекать данные порциями вместо целых и разбивать их на страницы? Я пытаюсь получить большие данные более чем на 300 000 строк (200 МБ) с помощью JDbcTemplate queryForList и вернуть разбитый на страницы ответ для моего API. Я не смог найти подходящее имя столбца для сортировки данных по моим потребностям, поэтому использовал ronum record_num. Ниже мой код.

final String sql = "SELECT * FROM (SELECT a.*, rownum record_num FROM (SELECT * FROM tableName WHERE MONTH = ? AND YEAR=?)a)"; 
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, month, year);

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Поскольку ваш вопрос был помечен spring-boot, я предполагаю, что вы используете подпружиненный загрузчик в некотором качестве. Почему бы вам не рассмотреть возможность использования пружинных данных JPA?

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Это позволит вам использовать инфраструктуру Repository. Тогда вы сможете использовать PagingAndSortingRepository. Это позволит вам получить доступ к своим результатам постраничным способом. Вот справочный материал .

0 голосов
/ 09 ноября 2018

Один из способов сделать это - использовать rownum псевдостолбец и запрос переноса. Если вы хотите прочитать строки 10-20 (обратите внимание, rownum начинается с 1):

SELECT * 
FROM ( SELECT *, rownum r FROM tableName WHERE month = ? AND year = ? ) 
WHERE r > 10 AND r <= 20

Однако, если вы используете Oracle 12c или новее, вы можете использовать новый оператор OFFSET, который база данных должна оптимизировать, чтобы пропустить чтение избыточных строк :

SELECT * 
FROM tableName 
WHERE month = ? AND year = ?
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
...