4
respostas

Erro possible non-threadsafe access to the session

Este erro tem hora que ocorre e tem hora que não.

18:34:17,109 ERROR [org.hibernate.AssertionFailure] (default task-12) HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: possible non-threadsafe access to the session

O que ele significa ?

Pesquisei e vi várias resposta , mas não entendi.

4 respostas

Bom, nunca passei por ele...A mensagem indica que a mesma session talvez esteja sendo compartilhada entre múltiplas threads. Mas agora só você pode dizer se a sua aplicação está compartilhando a session.

Sim está em várias threads.

O erro ocorre numa mesma consulta

Está assim o código.

    public void getEntityManager() {
        if (entityManager == null) {
            EntityManagerFactory factory = Persistence
                    .createEntityManagerFactory("desif");
            entityManager = factory.createEntityManager();
        }
    }

Consulta generica

public Set<?> listar(GHEntity entidadeUm, GHEntity entidadeDois,
            Integer primeiroRegistro, Integer totalRegistros,
            String... ordenacao) throws Exception {
        List aux = new ArrayList<>();
        getEntityManager();
        Session sessao = (Session) entityManager.getDelegate();
        Criteria crit = sessao.createCriteria(entidadeUm.getClass());
        montaRestricoes(entidadeUm, entidadeDois, crit);
        contarTodos(entidadeUm, entidadeDois);
        ordenar(crit, ordenacao);
        if (!(total.equals(new Long(0)))) {
            crit.setFirstResult(primeiroRegistro);
            crit.setMaxResults(totalRegistros);
        }
        aux = crit.list();
        RecordDataSet<GHEntity> linkedHashSet = new RecordDataSet<GHEntity>(aux);
        linkedHashSet.setTotal(total);
        // entityManager.clear();
        sessao.evict(entidadeUm);
        return linkedHashSet;
    }

Se eu deixo esta parte entityManager.clear();, ocorre o erro. Se tiro não ocorre.

Se testo com breackpoint, não ocorre o erro.

O código que pega um entitymanager, para mim, pode ser um pouco diferente. Eu deixaria o código que cria uma factory em algo estático, para não rodar várias vezes. Do EM em si, toda vez que aquele método for chamado, tem que criar um novo EM.

Entendi. Vou ver aqui o que alterar.