JPA + TOMCAT e Sessao

4 respostas
F

Pessoal, estou desenvolvedo um sistema de WEB onde uso Struts 2, JPA e tomcat 5.5.

Gostaria de saber, quanto a JPA, qual a melhor maneira para se conectar via JPA. Digo, existe aquelas duas linhas de comandos básicas para comecar a acessar o banco:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("helpDesk"); EntityManager em = emf.createEntityManager();

O problema é que faco isso a todo momento, sempre que vou fazer um SELECT, ou qualquer outro comando executo essas duasl linhas… e sempre a JPA criar uma nova sessao… acredito que se eu puder manter sempre a mesma sessao por usuario, o acesso a banco ficaria mais rapido.

Tem alguma forma “padrao” para manter?

P.S. Pensei em manter em sessao o objeto, mas como eu garantiria o em.close()? Ou isso a JPA gerencia pra mim?

Abracos.[/code]

4 Respostas

M

Opa,

Sugiro que você use o padrão sugerido pelo Hibernate: Uma sessão/EntityManger por request. Crie um filtro para gerenciar isto;

:joia:

F

hummm… blz… é o que eu faco hoje… mas demora quase 1 segundo so pra executar esse código…

Acredito que haja uma forma mais rapida… sei la…

Mas valew a dica. ja que o pessoal do hibernate diz isso… entao tah. ehhehe

Abracos!

J

Você não deve criar um EntityManagerFactory para cada requisição, pois toda vez que você criar o Factory, ele remonta todos os mapeamentos.

O que você precisa fazer é criar um EntityManager para cada requisição, mas a partir do mesmo EntityManagerFactory, coloque o codigo para criar o Factory no metodo init() do filtro.

Ex.:

public class PersistenceFilter implements Filter {
   private EntityManagerFactory emf;

   public void init(FilterConfig config) throws ServletException {
      this.emf = Persistence.createEntityManagerFactory("helpDesk");
   }

   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      EntityManager em = emf.createEntityManager();

      //restante do filtro
   }
}

Tente seguir mais ou menos o exemplo do hibernate, apesar de ser um pouco diferente.

http://www.hibernate.org/43.html

F

Opa,… blz… e se for o caso de eu estar usando o TopLink… entrei no site deles, mas nao existe uma recomendacao ou boas praticas dentro desta questao!!!

Andei fazendo algumas modificacoes… o que faco eh o seguinte: coloco ele na sessao do usuario… e sempre que existe uma requisicao, eu testo se a conexao esta aberta…

Sera que é valido essa minha alternativa??

Valew… Abracos…

Criado 6 de dezembro de 2007
Ultima resposta 10 de dez. de 2007
Respostas 4
Participantes 3