Получение большого объема данных с помощью Spring Boot - PullRequest
0 голосов
/ 04 мая 2020

Я пытался получить данные, используя SpringBoot для моего REST API, и мой запрос не работает, когда я пытаюсь получить нужные мне данные. Ожидаемые результаты запроса на выборку вернут ~ 50 столбцов и около 20 тыс. Записей. Я попытался ограничить свой запрос 3k записями, и мой запрос на выборку прошел, но мне действительно нужно получить все записи в одном go. У меня есть все необходимые данные в материализованном представлении, поэтому с запросом проблем не должно быть, и для быстрого выбора * в SQL плюс потребуется около 10 se c, чтобы вернуть все записи. Любые идеи о том, как мне пройти через это без истечения времени ожидания?

РЕДАКТИРОВАТЬ: Тестируя API через Insomnia, я не получаю никаких ошибок, а просто получаю сообщение «Нет ответа для ответа» через 5 минут.

Некоторые коды ниже:

DataListController. java

@ApiResponses(value = {
    @ApiResponse(code = 401, message = "Unauthenticated session for current user"),
    @ApiResponse(code = 403, message = "Insufficient privileges for current user"),
    @ApiResponse(code = 500, message = "Unhandled system exception")
})
@RestController
@RequestMapping("/api/v1")
public class DataListController {

    private DataSource dataSource;
    DataListService dataListService;

    @Autowired
    public DataListController(
            DataListService dataListService,
            DataSource dataSource
    ) {
        this.dataListService = dataListService;
        this.dataSource = dataSource;
    }

@ApiOperation(
            value = "Fetch All Data"
    )
    @ApiResponses(value = {
        @ApiResponse(code = 200, response = DataListRecord.class, responseContainer = "List", message = "Fetch all records")
    })
    @GetMapping({"/data/list"})
    public HttpEntity<List<Map>> getAllData(HttpServletResponse response) {
        List<Map> result = dataListService.getAllData();
        return ResponseEntity.ok(result);
    }
}

DataListService. java

@Service
public class DataListService {

    private DataListDao dataListDao;

    @Autowired
    public DataListService(
            DataListDao dataListDao
    ) {
        this.dataListDao = dataListDao;
    }

    public List<Map> getAllData() {
        return dataListDao.getAllData();
    }
}

DataListDao. java

@Mapper
public interface DataListDao {

    public List<Map> getAllData();

}

DataListDao. xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="project.repository.DataListDao">

    <select id="getAllData" resultType="map">
        select * from MV_DATA_LIST
    </select>

</mapper>

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Вы можете увеличить defaultStatementTimeout в своей конфигурации mybatis, чтобы предотвратить тайм-аут вызовов в базу данных. Согласно документации значение по умолчанию составляет 25 с.

0 голосов
/ 04 мая 2020

Попробуйте установить время ожидания вашего встроенного Tomcat

Добавьте этот параметр в ваше application.properties

server.connection-timeout=1200000

Или в этом случае вы используете properties.yml

server:
  connection-timeout: 1200000
...