Solucionado (ver solução)
Solucionado
(ver solução)
18
respostas

Carregar tabela cnae

Tenho uma tabela de CNAE.

Ao invez de toda vez que entrar nos formulários que chamam esta tabela, eu fazer uma consulta, que retorna mais ou menos 1500 registros. Há possibilidade de carregar esta informações em memória no servidor, toda vez que o iniciar o servidor ?

18 respostas

Oi Guilherme, tudo bem ?

Tem sim, você pode criar um objeto que faça o carregamento e deixar ele com escopo da aplicação, que ai todos vão ter acesso a ele.

Verdade, concordo!

Certo Matheus.

Como deixar o objeto no escopo da aplicação ?

Depende do framework web que está usando.

Spring, com Thymeleaf.

Você pode criar um @Component e anota-lo com @ApplicationScope

Tipo assim

@Component
@ApplicationScoped
public class cnae(){
        public Set<Cnae> buscarCnae(){
        ////Aqui dentro chamar a consulta...
       }
}

Em qualquer Controller que eu chamar o método desta, ele chama tem os resultados sem fazer a consulta ?

Isso !!!

Ai nas classes que você vai precisar usar você apenas injeta esse componente com a anotação @Autowired

Obrigado. Vou testar.

avisa se der certo :D

Mais ou menos. Toda vez que ele chama o componente ele faz uma consulta no banco.

Fiz assim:

package br.com.netsoft.componente;

import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.ApplicationScope;

import br.com.netsoft.dto.todos.CnaeDTO;
import br.com.netsoft.servico.todos.CnaeServico;

@Component
@ApplicationScope
public class CnaeComponent {

    @Autowired
    private CnaeServico cnaeServico;

    public Set<CnaeDTO> buscarCnae() {
        CnaeDTO dto = new CnaeDTO();
        dto.setSonenteCodigosAcimaNove(true);
        return cnaeServico.listar(0, 0, dto);
    }
}

Controller

package br.com.netsoft.controller.publico;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

import br.com.netsoft.componente.CnaeComponent;
import br.com.netsoft.model.notafiscal.NotaFiscalEntity;
import br.com.netsoft.servico.util.DataUtil;

@Controller
/***
 * Controller da página pública de cadastro de contador
 * 
 * @author Guilherme Costa
 */
public class PessoaContadorPreCadastroController extends NotaFiscalServicoController<NotaFiscalEntity> {

    private static final long serialVersionUID = 4679349908654563358L;

    @Autowired
    private CnaeComponent cnaeComponent;

    private void cnae(ModelAndView modelAndView) {
        modelAndView.addObject("cnaes", cnaeComponent.buscarCnae());
    }
}
solução!

O problema disso é que você tá fazendo a busca toda hora.

Tenta assim :

@Component
@ApplicationScope
public class CnaeComponent {

    @Autowired
    private CnaeServico cnaeServico;

private Set<CnaeDTO> cnaes;

    public Set<CnaeDTO> buscarCnae() {
        if (cnaes == null) {
            CnaeDTO dto = new CnaeDTO();
            dto.setSonenteCodigosAcimaNove(true);
            cnaes = cnaeServico.listar(0, 0, dto);
            return cnaes;
        } else {
            return  cnaes;
        } 
    } 
}

private Set cnaes; esta variável está sempre vazia.

Apenas na primeira vez, nas demais não.

Desculpe.

Mas o SQL é gerado toda vez que chamo este controle.

Não faz muito sentido, dessa forma deveria executar sim uma vez e nas demais reaproveitar a instância.

Me mostra como está fazendo seu código.

Qual código ?

package br.com.netsoft.componente;

import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.ApplicationScope;

import br.com.netsoft.dto.todos.CnaeDTO;
import br.com.netsoft.servico.todos.CnaeServico;

@Component
@ApplicationScope
public class CnaeComponent {

    @Autowired
    private CnaeServico cnaeServico;

    private Set<CnaeDTO> cnaes;

    public Set<CnaeDTO> buscarCnae() {
        if (cnaes == null) {
            CnaeDTO dto = new CnaeDTO();
             dto.setSonenteCodigosAcimaNove(true);
              cnaes = cnaeServico.listar(0, 0, dto);
            return cnaes;
        } else {
            return cnaes;
        }
    }
}

Agora que percebi que está funcionando.

Precisei de limpar o cache do servidor mais o projeto.

Ai vi que ele só faz a consulta quando entra a primeira vez.