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

Queries Dinâmicas + HashMap + Vazamento de memória

Olá, acho que é quase unanimidade que essa criteria do JPA é bem verbosa e chata, mas também é unanimidade que ficar concatenando String para fazer queries dinâmicas também é bem chato. Para tentar escapar dessas situações eu , eu utilizo uma solução baseada em HashMap para passar os parâmetros para a querie, segue um trecho do meu repositório de estabelecimentos:

public List<Estabelecimento> pesquisar(String nome,Long segmentoId){

        HashMap<String, Object> params = new HashMap<>();
        StringBuffer hql = new StringBuffer("select new br.com.tropicalshoping.modelos.Estabelecimento(e.estabelecimentoId,e.nome,e.logo) from Estabelecimento e where 1=1 ");
        if(nome != null && !nome.isEmpty()){
            hql.append("and lower(e.nome) like :nome ");
            params.put("nome", "%"+nome.toLowerCase()+"%");
        }
        if(segmentoId != null){
            hql.append("and e.segmento.segmentoId = :segmento ");
            params.put("segmento", segmentoId);

        }
        hql.append(" order by e.nome");
        TypedQuery<Estabelecimento> query = em.createQuery(hql.toString(), Estabelecimento.class);
        for(Entry<String, Object> entry : params.entrySet()){
            query.setParameter(entry.getKey(),entry.getValue());
        }

        List<Estabelecimento> estabelecimentosList = query.getResultList();
        return estabelecimentosList;
    }

A solução funciona perfeitamente, porém ao rodar a jvisualvm e fazer um Heap Dump, entre os dois maiores objetos que tenho em mémoria estão relacionados com HashMap, e eu so utilizo HashMap nos meus repositórios para este tipo de consulta. O trecho de código acima apresenta algum problema de vazamento de memória?

2 respostas
solução!

Oi Ricardo, não vi nada de errado... ainda mais que esse mapa é utilizado apenas dentro do método, ele deveria morrer logo aí também.

acredito que seja algo na própria configuração da JVM