Como resolver esse erro "EntityManager is closed" ?
10 respostasResolvido
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
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 ??
lucciano01
tenta isso:
manager.close(); factory.close();
Ivanildolima01
Fazendo isso dar o seguinte erro: java.lang.OutOfMemoryError: PermGen space
lucciano01
esse problema é devido ao “estouro” da memória na JVM, mate todos seus processos java pelo Gerenciador de Tarefas e tente executar novamente
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.
lucciano01
posta o código do metodo Arquivo.gravaBD
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;}
`
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 !!
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/