Como resolver esse erro "EntityManager is closed" ?
10 respostasResolvido
I
Ivanildolima01
Boa noite galera !! Estou com um problema na minha aplicação que não estou conseguindo resolver…Estou utilizando VRaptor mais Hibernate/JPA, e sempre quando vou gravar algo no Banco de Dados apenas o primeiro registro é gravado e a partir do segundo da erro: “EntityManager is closed”. Já pesquisei em vários fóruns sobre esse problema mas ainda não consegui resolver, alguém aí poderia me ajudar ?? Grato !! Segue abaixo mais informações
a mensagem diz bastante: antes de voce invocar esse adiciona alguem acabou fechando o manager. provavelmente o outro metodo chamado tambem tem o manager.close, como esse que voce postou.
voce deve manter o manager aberto durante uma transacao ou sequencia de transacoes que considerar fazer sentido
I
Ivanildolima01
Só que não tem nenhum outro método que chama “manager.close”, só o adiciona mesmo. Resolvi esse problema retirando o “manager.close” do adiciona, agora não sei se é recomendado fazer isso. Tem algum problema em deixar o “manager.close” sempre aberto ??
L
lucciano01
tenta isso:
manager.close(); factory.close();
I
Ivanildolima01
Fazendo isso dar o seguinte erro: java.lang.OutOfMemoryError: PermGen space
L
lucciano01
esse problema é devido ao “estouro” da memória na JVM, mate todos seus processos java pelo Gerenciador de Tarefas e tente executar novamente
I
Ivanildolima01
Ainda continua gerando a “EntityManager is closed”…Como j citado acima, a solução encontrada foi deixar ela sempre aberta…Só não sei se é correto fazer isso.
L
lucciano01
posta o código do metodo Arquivo.gravaBD
I
Ivanildolima01
`publicBooleangravaBD(StringdiretorioArquivo){try{FileInputStreamstream;// Lendo o arquivo, conforme o diretorio informadostream=newFileInputStream(diretorioArquivo);InputStreamReaderreader=newInputStreamReader(stream);BufferedReaderbr=newBufferedReader(reader);// Variavel que armazena a linha a ser lidaStringlinha=br.readLine();// Variavel que conta o numero de linhas lida até o momentointcontLoop=0;// Executa esse Loop enquanto existir linhas a serem lidaswhile(linha!=null){// Verifica se a linha é em brancoif(linha.equals("")){linha=br.readLine();// pula o restante do codigo e lê uma nova linhacontinue;}// Armazena os itens da linha, separadando-os por “,“String[]itens=linha.split(”,”);// Adicionando os itens a suas respectivas variaveisStringdataHora=itens[0];// Convertendo de String para DateDatedataUtil=formatadorYMDHMS.parse(dataHora);java.sql.TimestampdataSql=newjava.sql.Timestamp(dataUtil.getTime());
Stringtemperatura=itens[1];Stringumidade=itens[2];Stringpressao=itens[3];System.out.println(dataSql+" "+temperatura+" "+umidade+" "+pressao);// Adicionando os dados formatados ao objetoClimaclima=newClima();clima.setDataHora(dataSql);clima.setTemperatura(Float.parseFloat(temperatura));clima.setUmidade(Float.parseFloat(umidade));clima.setPressao(Float.parseFloat(pressao));// Adicionando dados ao bancoresultado=dao.adiciona(clima);// Incrementa contador de loopcontLoop++;// Mostra o progresso da gravação no monitorSystem.out.println("Gravado: "+contLoop);// Lê uma nova linhalinha=br.readLine();}}catch(FileNotFoundExceptionex){Logger.getLogger(Arquivo.class.getName()).log(Level.SEVERE,null,ex);}catch(IOException|ParseExceptionex){Logger.getLogger(Arquivo.class.getName()).log(Level.SEVERE,null,ex);}returnresultado;}
`
I
Solucao aceita
Ivanildolima01
Consegui resolver o problema…Apenas coloquei essa linha de codigo dentro do metodo adiciona:
Dessa forma, toda vez que o adiciona é chamado o manager é instanciado e ao final do metodo ele é finalizado. Não sei se é boa prática, mas funcionou !! Obrigado pela ajuda galera !!
I
igomes
Voce poderia criar um interceptor que faz esse trabalho pra você já que usando vraptor, ou você pode usar um plugin do próprio vraptor e não fazer mais esse trabalho de manipular abertura/fechamento de transação. http://www.vraptor.org/pt/docs/plugins/