JPA inconsistente e desatualizado

3 respostas
dwduncan

Bom dia a todos. Tenho um sistema que utiliza JPA para acessar um banco de dados MYSQL. Ele é parte de outro sistema muito maior, dessa forma ele busca por determinados dados de acordo com a atualização deles por outros aplicativos (Ou seja, meu entityManager não detém o monopólio do banco). O interessante é que o resultado é sempre o mesmo, independente de o banco já ter sido atualizado com outras informações.

Aqui segue o código que busca os objetos para atualização:

@Override
    public List<T> listaAtualizacao(long codigoAtualizacao,int limite,EntityManager em) {

        try {
            String queryS = "SELECT obj FROM " + oClass.getSimpleName() + " obj";
            Query q = null;
            if (codigoAtualizacao > 0) {
                queryS += " WHERE obj.atualizacao IS NULL OR obj.atualizacao NOT LIKE :cod";
                q = em.createQuery(queryS);
                if (limite > 0) {
                    q.setMaxResults(limite);
                }
                q.setParameter("cod", "%;" + codigoAtualizacao + ";%");
            } else {
                q = em.createQuery(queryS);
            }

            List<T> lista = (List<T>) q.getResultList();

            em.close();

            if (lista != null && lista.size() > 0) System.out.println(queryS + "     codparam: " + "%;" + codigoAtualizacao + ";%");

            return lista;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }

Reparem que eu passo o entityManager para o método. Foi uma tentativa desesperada de toda vez que o método fosse invocado eu forçasse o entityManagerFactory a trabalhar:

public synchronized EntityManager getEntityManager(){
        return entityManagerFactory.createEntityManager();
    }

O código está dentro de um loop, para que sistema sempre verifique as atualizacoes.

Nada surtiu efeito, o resultado sempre é o mesmo, o programa pode rodar por horas que mesmo após eu apagar todas as linhas da tabela o sistema continua retornado a mesma lista de resultados.

Alguém sabe o que fazer para que o JPA faça o óbvio e retorne uma lista realimente atualizada.

ps: já tente entityManager.clear(), sem efeito.

3 Respostas

dwduncan

Sei que é uma questão de cache. Melhorando a pergunta, alguém sabe como limpar o cache no JPA.

G

EntityManager.clear();

No JPA1 o cache não faz parte da spec. Porém usando Hibernate como implementação fazendo o clear ele limpa o cache também, já que todas as entities ficam como “detached”.

dwduncan

Como disse, não surtiu efeito. Pesquisando descobri que muitos tiveram o mesmo problema que eu, ninguém ainda conseguiu resolver diretamente o problema. O pior é justamente essa deficiência do JPA, a qual ele deve manter o “monopólio” do banco. Seria tão simples se ele realmente limpasse o cache de 1º nível. A coisa tá tão absurda que nem invocando entityManagerFactory.createEntityManager(); funciona, só realmente reiniciando completamente a PersistentUnit, o que é extremamente demorado e fora de questão.

Criado 6 de abril de 2010
Ultima resposta 6 de abr. de 2010
Respostas 3
Participantes 2