SQLException no Java - resolvido

No primeiro erro de SQLException, ele para o processo.

Collection<GraficoRetornoDTO> retorno = new ArrayList<>();
		try {
			RedeInternaDTO rede = redeClient.buscarPorId(idRede);
			Connection con;
			if (rede.isBaseLocal()) {
				con = getConnection("jdbc:sqlserver://" + sqlServerUrl + ":" + sqlServerPorta, sqlServerUsuario,
						sqlServerSenha);
			} else {
				con = getConnection("jdbc:sqlserver://" + rede.getUrl() + ":" + rede.getPorta(),
						rede.getUsuarioAcesso(), rede.getSenhaAcesso());
			}
			Collection<GraficoNomeSqlDTO> graficos = graficoClient.buscarTodosGrafico();
			Set<Long> idsLoja = new HashSet<>();
			if (dto.getLojas() != null && !dto.getLojas().isEmpty()) {
				dto.getLojas().forEach(entidade -> idsLoja.add(entidade));
			} else {
				usuarioLojaService.buscaTodosUsuarioLogado(principal)
						.forEach(entidade -> idsLoja.add(entidade.getId()));
			}
			for (GraficoNomeSqlDTO grafico : graficos) {
				String sql = grafico.getSqlS().replaceAll("TAB", rede.getNomeBanco() + ".dbo." + "TAB");
				log.info("sql: " + sql);
				sql = andWhereDataInicioDataFimLojas(dto, sql, idsLoja);
				log.info("sql: " + sql.toString());
				final Statement s = con.createStatement();
				final ResultSet rs = s.executeQuery(sql);
				final Collection<String> campos = campos(rs);
				Collection<GraficoRetornoPizzaRosquinhaDTO> pizzasRosquinhas = new ArrayList<>();
				Collection<GraficoRetornoBarraSerieDTO> series = new ArrayList<>();
				Collection<GraficoRetornoBarraValorDTO> valores = new ArrayList<>();
				Collection<JSONObject> jsons = new ArrayList<>();
				if (rs.next()) {
					while (rs.next()) {
						if (PIZZA == grafico.getGraficoTipo() || ROSQUINHA == grafico.getGraficoTipo()) {
							pizzaRosquinha(rs, campos, pizzasRosquinhas);
						} else if (BARRA == grafico.getGraficoTipo() || LINHA == grafico.getGraficoTipo()) {
							barraLinha(rs, campos, series, jsons);
						}
					}
				}
				if ((BARRA == grafico.getGraficoTipo() || LINHA == grafico.getGraficoTipo()) && !jsons.isEmpty()
						&& !series.isEmpty()) {
					retorno.add(GraficoRetornoDTO.builder().jsons(jsons).nome(grafico.getNome()).id(grafico.getId())
							.valoresBarra(valores).seriesBarra(series).graficoTipo(grafico.getGraficoTipo().name())
							.pizzasRosquinhas(pizzasRosquinhas).build());
				} else {
					if ((PIZZA == grafico.getGraficoTipo() || ROSQUINHA == grafico.getGraficoTipo())
							&& !pizzasRosquinhas.isEmpty()) {
						retorno.add(GraficoRetornoDTO.builder().jsons(jsons).nome(grafico.getNome()).id(grafico.getId())
								.valoresBarra(valores).seriesBarra(series).graficoTipo(grafico.getGraficoTipo().name())
								.pizzasRosquinhas(pizzasRosquinhas).build());
					}
				}
			}
			con.commit();
			con.close();
		} catch (final SQLException e) {
			log.error(e.getMessage(), e);
		}
		return retorno;

Mesmo dando Exception, como fazer para continuar executando ?

Qual processo você quer continuar executando?

Consegue contextualizar mais o fluxo e necessidade?

1 curtida

for (GraficoNomeSqlDTO grafico : graficos) {

Este for.
Se der erro no primeiro ou em qualquer, continuar. No caso de SQLException

Isola o ponto de falha e segue o processamento!

for (final GraficoNomeSqlDTO grafico : graficos) {

    // processamento

    try {
        //bloco que lança SQLException
    } catch (final SQLException ex) {
        log.error("An error occurred but was ignored", ex);
    }

    // processamento

}

2 curtidas

Outra coisa no código abaixo

if (rs.next()) {
	while (rs.next()) {
		if (PIZZA == grafico.getGraficoTipo() || ROSQUINHA == grafico.getGraficoTipo()) {
			pizzaRosquinha(rs, campos, pizzasRosquinhas);
		} else if (BARRA == grafico.getGraficoTipo() || LINHA == grafico.getGraficoTipo()) {
			barraLinha(rs, campos, series, jsons);
		}
	}
}

Remova o primeiro if somente o while é suficiente, senão você sempre estará ignorando o primeiro registro.

E use uma variável local para armazenar o grafico.getGraficoTipo(), atualmente você está chamando esse método diversas vezes.

1 curtida

Sobre o if (rs.next()) {, foi ajustado.

Esta grafico.getGraficoTipo(), é uma String.

Obrigado

Vou testar @Jonathan_Medeiros

Sim, o retorno é uma String, mas você está chamando diversas vezes um mesmo método, isso tem custo, por isso chama uma única vez e armazena o retorno em uma variável local.

1 curtida