Pergunta

Eu tenho um servlet em execução em um servidor Oracle OCCAS. Atualmente eu mapear alguns dados em um banco de dados para uma classe de entidade no meu aplicativo usando @Entity annotaion. Eu não conseguem injetar o EntityManager (@PersistenceContext), porém, e ao meu entendimento de que é porque ele está sendo executado em meu contexto servlet e não como uma entidade EJB separado. Criando o gerente através das obras EntityManagerFactory, embora, de modo que é o que eu uso no momento.

Agora, depois de uma série de reinicializações do aplicativo, recebo um erro de falta de espaço PermGen. Eu acho que isso está relacionado com a persistência de alguma forma. Há uma chamada para EntityManager.close () no meu método finalize, mas nunca aparece no registro.

É este um mau caminho de fazer as coisas - estou "necessária" para ter um Bean de Entidade separada, ou como é que eu vou limpar o EntityManager

?
Foi útil?

Solução

Eu tive um problema semelhante e resolvido-lo usando ThreadLocal e um filtro de servlet.

Aqui está um post no meu blog detalhando o que você precisa fazer ; basicamente, seus conjuntos de filtros de servlet até o gerenciador de entidades e depois fecha-lo depois da conclusão do atendimento servlet; faz o gerenciador de entidade disponível como uma variável local de segmento (por recomendação do hibernate). Você também precisa capturar exceções no filtro e fazer um rollback.

BTW, finalize não é garantido para ser chamado na maneira que você pensa. finalize deve ser chamado antes de sair da JVM, mas fora isso, ele poderia ser um longo tempo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top