Pessoal,
Gostaria de saber qual seria a melhor pratica de se usar o factory.
Em meu ultimo projeto utilizei um método Static em classe, veja:
public class Factory {
public static EntityManagerFactory EManager() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("innews");
return factory;
}
}
Quando o usuário entrava no sistema, o código criava uma factory e armazenava até que a mesma não fosse mais valida, então, um novo factory seria criado, vejam:
public EntityManager entity() {
if (eManagerFactory != null) {
return eManagerFactory.createEntityManager();
} else {
eManagerFactory = Factory.EManagerBanco();
return eManagerFactory.createEntityManager();
}
}
A classe do usuário logado é do tipo @SessionScoped.
Agora, estou criando um novo projeto e estou pensando em utilizar um ManagedBean anotado com @ApplicationScoped para servir toda a aplicação, e retornar o mesmo entityManager valido a todos os usuários.
O problema é que ainda não testei. É uma boa pratica? é a melhor forma?
Minha preocupação é o fato de o mesmo EntityManager ser passado a qualquer usuário.
O que vocês mais experientes pode me dizer?
Obrigado
Pare de fazer, estude pra valer o jpa e depois volte a fazer o projeto que você estava a fazer.
- EntityManager não é thread safe e nem deve ser compartilhado entre usuários
- Não existe a necessidade de criar o EntitymanagerFactory a cada chamada, isso é um killer de desempenho e totalmente desnecessário.
- EntityManager e EntityManagerFactory sendo acessado por ManagedBean? Outra coisa exótica aí.
Seria uma boa prática deixar o EntityManagerFactory em uma classe application scoped e esse cara servir a aplicação inteira.
Leia esse post e entenda melhor os conceitos do JPA: http://uaihebert.com/?p=1622
[=
Só esclarecendo, acho que posso ter sido interpretado errado. Vejamos:
Sobre a 1… Não compartilho o EntityManager com todos os usuários. Pensei em criar uma classe do tipo @ApplicationScooed pra criar o EntityMa agerFactory e retornar a qualquer usuário da aplicação, isso esta correto? É seguro?
Sobre a 2… Eu crio ele por usuário, e após criado, enquanto estiver valido retorno o mesmo EMF pra o usuário criado.
Sobre a 3… Eu tenho um bean @SessionScoped que guarda as infos do usuário, neste mesmo vejam eu armazeno o EMF criado. Isso e o seguro e errado?
Vou ler o seu post lá, espero esclarecer bastante as idéias.
Vlw
[quote=weder.vierra]Só esclarecendo, acho que posso ter sido interpretado errado. Vejamos:
Sobre a 1… Na aplicação existente eu não compartilho o EntityManager com todos os usuários. Na nova app Pensei em criar uma classe do tipo @ApplicationScoped pra criar o EntityManagerFactory e retornar a qualquer usuário da aplicação, isso esta correto? É seguro?
Sobre a 2… Na aplicação atual eu crio o EMF por usuário, e após criado, enquanto estiver valido retorno o mesmo EMF pra esse usuário, quando não for mais valido eu crio um novo, na sessão desse usuário.
Sobre a 3… Na aplicação eu tenho um bean @SessionScoped que guarda as infos do usuário, neste mesmo Bean eu armazeno o EMF criado. Isso inseguro e errado?
Vou ler o seu post lá, espero esclarecer bastante as idéias.
Vlw[/quote]
Desculpem, tentei responder pelo celular e foi uma confusão só, não consegui deletar o primeiro post.