JPA...Duvida em Singleton com EntityManagerFactory?
5 respostas
P
paribe
Olá,
duvida no acesso a EntityManagerFactory pois criei como Singleton
e ao rodar conforme abaixo está trazendo duas instancias diferentes
da EntityManagerFactory fiz porque vai ter varios acessos e queria
que pegasse somente uma instancia ???
É correto fazer isso ou JPA não aceita ???
abs
publicclassPersistenceServiceFactory{privatestaticEntityManagerFactoryemf=null;privatestaticEntityManagerem=null;privatestaticPersistenceServiceFactoryinstance=newPersistenceServiceFactory();privatePersistenceServiceFactory(){}publicstaticPersistenceServiceFactorygetInstance(){returninstance;}publicstaticEntityManagercreate(){try{emf=Persistence.createEntityManagerFactory("ims");System.out.println("Factory = "+emf);em=emf.createEntityManager();System.out.println("Manager = "+em);}catch(Exceptione){System.out.println("Não conseguiu acesar o Banco ");}returnem;}}
Vc pode sim, a meu ver utilizar um EMF como singleton.
G
GraveDigger1 like
Cara,
Criar entityManagerFactory é uma operação pesada, justamente por isso ele é uma factory, a idéia é que exista poucas(preferencialmente uma, mas em alguns casos são necessárias mais)
Em compensação o createEntityManager é uma operação barata.
Seu codigo deveria ser:
publicstaticEntityManagercreate(){try{if(emf==null){emf=Persistence.createEntityManagerFactory("ims");System.out.println("Factory = "+emf);}em=emf.createEntityManager();System.out.println("Manager = "+em);}catch(Exceptione){System.out.println("Não conseguiu acesar o Banco ");}returnem;}
Agora, se seu caso for(estou começando a suspeitar que seja) um caso típico de quem trabalha com SAAS(Software as a Service) onde cada cliente possui um banco de dados, vc terá que usar uma outra abordagem completamente diferente, se não sua aplicaçao vai ficar MTO pesada. Pq entityManager é algo que deve ser criado com frequencia, e se vc vincular a criação de um EntityManagerFactory a isso sua aplicação vai ficar bem lenta sem necessidade.
Se for esse seu caso, avise para que eu possa te indicar um post que eu mesmo criei pois tive que enfrentar esse problema recentemente.
Abs,
L
leonardo.carbone
Olá, tenho uma situação igual a que vc comentou neste post, onde cada cliente tem sua base. Você poderia me indicar o post que escreveu para resolver essa situação!
Grato pela ajuda.
Leonardo.
GraveDigger:
Cara,
Criar entityManagerFactory é uma operação pesada, justamente por isso ele é uma factory, a idéia é que exista poucas(preferencialmente uma, mas em alguns casos são necessárias mais)
Em compensação o createEntityManager é uma operação barata.
Seu codigo deveria ser:
publicstaticEntityManagercreate(){try{if(emf==null){emf=Persistence.createEntityManagerFactory("ims");System.out.println("Factory = "+emf);}em=emf.createEntityManager();System.out.println("Manager = "+em);}catch(Exceptione){System.out.println("Não conseguiu acesar o Banco ");}returnem;}
Agora, se seu caso for(estou começando a suspeitar que seja) um caso típico de quem trabalha com SAAS(Software as a Service) onde cada cliente possui um banco de dados, vc terá que usar uma outra abordagem completamente diferente, se não sua aplicaçao vai ficar MTO pesada. Pq entityManager é algo que deve ser criado com frequencia, e se vc vincular a criação de um EntityManagerFactory a isso sua aplicação vai ficar bem lenta sem necessidade.
Se for esse seu caso, avise para que eu possa te indicar um post que eu mesmo criei pois tive que enfrentar esse problema recentemente.
Abs,
L
Lavieri
nenhuma dessas forma é realmente a mais adequada.... em um ambiente multi-thread é seguro se precaver contra concorrencia, veja essa abordagem...
importjavax.persistence.EntityManager;importjavax.persistence.EntityManagerFactory;importjavax.persistence.Persistence;importorg.apache.log4j.Logger;importorg.hibernate.HibernateException;importorg.hibernate.Session;importorg.hibernate.ejb.HibernateEntityManager;publicclassHibernateUtil{privatestaticEntityManagerFactoryemf;publicstaticEntityManagerFactorygetEmf(){if(emf==null){synchronized(HibernateUtil.class){if(emf==null)try{emf=Persistence.createEntityManagerFactory("sua_unidade_de_persistencia");}catch(RuntimeExceptionex){Logger.getLogger(HibernateUtil.class).fatal("não foi possível carregar a unidade de persistencia",ex);throwex;}}}returnemf;}publicstaticEntityManagercreateEm(){try{returngetEmf().createEntityManager();}catch(RuntimeExceptionex){Logger.getLogger(HibernateUtil.class).error("falha ao criar EntityManager",ex);throwex;}}publicstaticSessioncreateSession(){return((HibernateEntityManager)createEm()).getSession();}}
G
GraveDigger
leonardo.carbone:
Olá, tenho uma situação igual a que vc comentou neste post, onde cada cliente tem sua base. Você poderia me indicar o post que escreveu para resolver essa situação!
Grato pela ajuda.