Estou usando JPA aqui e notei que o Persistence.createEntityManagerFactory() demora um certo tempo, acredito que por estar abrindo as conexões, é portanto inviável criar a cada request, e acho q nem é o certo
O que eu devo fazer? Colocar em um atributo estático/singleton?
Meu medo é que o banco costuma dar erro e fechar as conexões. Se estiver em um atributo estático e isso ocorrer, quando eu tentar acessar novamente o EntityManagerFactory vai dar certo?
A criação de EntityManagers é bem custosa. Com certeza você não deve chamá-la no corpo do seu serviço. É um aplicativo padrão ou web?
Veja o material da K19. Tem uma apostila bem interessante de JPA2 com Hibernate.
Se não for web, eles indicam que você crie uma classe “JPAUtil” com um atributo estático para que você reaproveite em toda a aplicação.
http://www.k19.com.br/downloads/apostilas-java
Bom, ali na apostila também tem um exemplo pra aplicativo web.
Se for um serviço web, por exemplo com Axis2, a criação deve ocorrer durante a implantação do serviço.
Para este caso, veja aqui ou aqui.
Olhei a apostila, ela cita as opções de inicializar o EntityManagerFactory em um Filtro ou deixar o container gerenciar, mas ainda assim não consegui entender só com o que tem na apostila como implementar tudo. Como eu adquiriria a instância de EntityManagerFactory no código da aplicação por exemplo? E ainda tenho a dúvida, se o banco der erro e fechar as conexões (isso é comum aqui) eu ainda vou conseguir usar a mesma instância do EntityManagerFactory?
Amigo de uma olhada sobre pool de conexão, existe varias opções