Estou com um problema de performance onde tenho 10 carros alugados e preciso popular um gráfico de linhas com esses 10 carros no entanto está demorando muito tempo para abrir a tela. Segue a lógica que utilizei para fazer Teria uma maneira de melhorar esse código para a tela abrir mais rápido pois, e complicado para o usuário ter que esperar mais de 4 minutos para a tela abrir. Ao abrir a tela e feita a consulta 10 vezes (primeiro for de carros) e mais 200 consultas dentro do while Qual seria a melhor solução para esse problema?
public List<CarroVO> carrosAlugadosPorMes() {
List<CarroVO> listaCarrosAlugados = new ArrayList<>();
List<LinkedHashMap<String, List>> carrosAlugados = mapCarros();
// obterCarrosAlugados = id = marcaCarro
for (LinkedHashMap carroAlugado : carrosAlugados) {
LinkedHashMap<String, Integer> carroMesTotal = new LinkedHashMap<>();
LocalDate dataAtual = LocalDate.now();
LocalDate ultimoMes = dataAtual.minusMonths(11);
LocalDate mesBalanco = LocalDate.of(ultimoMes.getYear(),
ultimoMes.getMonth(), ultimoMes.getMonth().length(ultimoMes.isLeapYear()));
LocalDate ultimoDiaMes = LocalDate.of(dataAtual.getYear(), dataAtual.getMonth(),
dataAtual.getMonth().length(dataAtual.isLeapYear()));
while ( mesBalanco.isBefore(ultimoDiaMes) ||
mesBalanco.isEqual(ultimoDiaMes)) {
Month mes = mesBalanco.getMonth();
String noMesAtual = mes.getDisplayName(TextStyle.SHORT, new Locale("pt", "BR"));
int numeroDias = mes.length(mesBalanco.isLeapYear());
Calendar calendar = ultimoDiaMes(mesBalanco.getYear(), mesBalanco.getMonthValue(), numeroDias);
//Aqui faz a consulta para popular o gráfico de linhas onde utilizo nativeQuery contendo duas pesquisas uma para tipo 1 de carro e outra para o tipo 2 de carro
Integer totalCarros = carroDao.consultaBanco(calendar, new ArrayList( carroAlugado.values() ));
carroMesTotal.put(noMesAtual, totalCarros);
mesBalanco = mesBalanco.plusMonths(1);
}
CarroVO carroVO = new CarroVO();
carroAlugado.forEach((k,v) -> carroVO.setMarcaCarro(k.toString()) );
List<LinkedHashMap<String, Integer>> totalCarros = new ArrayList<>();
totalCarros.add(carroMesTotal);
carroVO.setTotalCarro(totalCarros);
listaCarrosAlugados.add(carroVO);
}
return listaCarrosAlugados;
}