Mult-thread JPA EclipseLink

13 respostas
Miltex

Bom dia, pessoal !

Alguém sabe me dizer se o EclipseLink (EntityManagerFactory) suporta mult-thread ???

Na WebApp que estou trabalhando a fabrica vai ser instanciada somente uma vez e então os EM serão criados e distribuídos sob as outras requisições dos clientes.
:?:

13 Respostas

Hebert_Coelho

Até onde eu já li, EntityManagerFactory é thread safe.

Hebert_Coelho

Em breve vou estar escrevendo um post que fala sobre isso, já estou formatando para falar a verdade.

Enquanto o post não fica pronto, aqui mostra várias abordagens: http://stackoverflow.com/questions/3711439/how-to-create-a-thread-safe-entitymanagerfactory

rogeriopaguilar

Sim. Você tem que garantir que apenas um objeto factory seja criado, utilizando uma das abordagens que o colega passou no link ou então utilizar esta abordagem para inicializar o entitymanagerfactory:

Outra possibilidade é utilizar algum framework de injeção de dependências e deixar que ele gerencie o ciclo de vida do entitymanagerfactory. Nesse caso você injeta o entitymanager nas suas classes.

Hebert_Coelho

rogeriopaguilar:
Outra possibilidade é utilizar algum framework de injeção de dependências e deixar que ele gerencie o ciclo de vida do entitymanagerfactory. Nesse caso você injeta o entitymanager nas suas classes.
Eu pessoalmente prefiro essa.
O problema de ter um EMF na unha, é o persistence context.

Ele vai só crescendo e pode estourar a memória do servidor. Por isso que eu gosto de deixar com o servidor. [=

Miltex

Valew pelas dicas pessoal !

No meu caso estou desenvolvendo um projeto com GWT+JPA.

Instalei o plugin do Google no Eclipse e estou trabalhando no modo de desenvolvimento então utilizo conteiner do plugin q me parece ser o jety… não lembro agora…

seria possível utilizar essa abordagem (injeção de dependências) neste contexto ?

Quando vcs falam em deixar para o servidor gerenciar a fabrica, seria tipo inserindo anotações @persistenceUnit ??? eu sou meio junior nisso ainda…

Deve ser somente servidor de App ou pode ser um conteiner para trabalhar no contexto do servidor gerenciando os EM ???

vcs tem algumas dicas ou materiais sobre injeção de dependências aí ??? poderia me passar ???

:roll:

Miltex

Hebert Coelho, vc me passou este link:
http://stackoverflow.com/questions/3711439/how-to-create-a-thread-safe-entitymanagerfactory

Está seria a melhor das opções apresentadas da discussão acima:

public class JPAHelper {  
  
private static JPAHelper myHelper = new JPAHelper();  
private static EntityManagerFactory myFactory = null;  
  
/** 
  * Private constructor. Implementing synchronization with double-lock check 
  */  
private JPAHelper() {  
  
  if(myFactory == null) {  
   synchronized (JPAHelper.class) {  
  
    // This second check will be true only for the first thread entering the block incase   
    // of thread race  
    if(myFactory == null) {  
     myFactory = Persistence.createEntityManagerFactory("MyUnit");  
    }  
   }  
  }  
}  
  
/** 
  * Static Accessor Method 
  * @return 
  */  
public static JPAHelper getInstance() {  
  if(myHelper == null) {  
   myHelper = new JPAHelper();  
  }  
  return myHelper;  
}  
  
  
public EntityManagerFactory getJPAFactory() {  
  return myFactory;  
}

Criação do EntityManager

EntityManager objectManager = JPAHelper.getInstance().getJPAFactory().createEntityManager();

se alguém puder me dar uma :idea: ajuda aí ...

valew!

Hebert_Coelho
Eu utilizo como abaixo:
import javax.persistence.*;
 
public abstract class ConnectionFactory {
    private ConnectionFactory() {
    }
 
    private static EntityManagerFactory entityManagerFactory;
 
    public static EntityManager getEntityManager(){
        if (entityManagerFactory == null){
            entityManagerFactory = Persistence.createEntityManagerFactory("MyPersistenceUnit");
        }
 
        return entityManagerFactory.createEntityManager();
    }
}
Esse é o código do meu próximo post por falar nisso. Agora que a parte em português está pronta, já da para postar.[= Para conseguir um novo entityManager ficaria
EntityManager entityManager = ConnectionFactory.getEntityManager();
Miltex
Hebert Coelho:
Eu utilizo como abaixo:
import javax.persistence.*;
 
public abstract class ConnectionFactory {
    private ConnectionFactory() {
    }
 
    private static EntityManagerFactory entityManagerFactory;
 
    public static EntityManager getEntityManager(){
        if (entityManagerFactory == null){
            entityManagerFactory = Persistence.createEntityManagerFactory("MyPersistenceUnit");
        }
 
        return entityManagerFactory.createEntityManager();
    }
}
Esse é o código do meu próximo post por falar nisso. Agora que a parte em português está pronta, já da para postar.[= Para conseguir um novo entityManager ficaria
EntityManager entityManager = ConnectionFactory.getEntityManager();

Blz ?

Como você vai garantir o controle de concorrência dos EntityManager ?

Com o padrão singleton, o qual você está utilizando, garante apenas que vai ser instanciada somente uma fabrica.

Como pode ser controlado a concorrência entre as instancias dos EM, pois o ambiente é web, e pode haver varias requisições a fabrica de EM.

Na verdade, como vamos garantir a integridade do BD, pois haverá várias entidades de EM realizando transações simultaneamente.

vlws!!! :lol:

Hebert_Coelho

Basta você não repassar o EM para outras threads.

O EMF não vai repassar o mesmo EM duas vezes seguidas.

Miltex

Hebert Coelho:
Basta você não repassar o EM para outras threads.

O EMF não vai repassar o mesmo EM duas vezes seguidas.

Então, se eu tiver, por exemplo, 100 requisições a aplicação (servidor) serão criados 100 EM ??? é isso msm ???

Quem deve gerenciar isso, a aplicação ou próprio framework (EclipseLink) já deixa isso transparente para o desenvolvedor.

E com relação a concorrência e manter a integridade do BD ??? Vi que podemos utilizar estratégias; pessimista ou otimista, para garantir que os objetos
gerenciados por EM diferentes não sofram acessos simultâneos e tirem a consistência do objeto que está no contexto das duas instancias dos EMs.

Hebert_Coelho

Miltex:
Hebert Coelho:
Basta você não repassar o EM para outras threads.

O EMF não vai repassar o mesmo EM duas vezes seguidas.

Então, se eu tiver, por exemplo, 100 requisições a aplicação (servidor) serão criados 100 EM ??? é isso msm ???

Quem deve gerenciar isso, a aplicação ou próprio framework (EclipseLink) já deixa isso transparente para o desenvolvedor.

E com relação a concorrência e manter a integridade do BD ??? Vi que podemos utilizar estratégias; pessimista ou otimista, para garantir que os objetos
gerenciados por EM diferentes não sofram acessos simultâneos e tirem a consistência do objeto que está no contexto das duas instancias dos EMs.

Pq você não faz o teste? Faz um for nesse método e chama 1000 vezes por exemplo e compare os EntityManagers que foram retornados.

Quanto a Concorrencia do DB você pode implementar as estratégias que você citou numa boa com JPA. A estratégia em si não é afetada por um EMF único ou não.

Miltex

Hebert Coelho,

estou precisando de alguém que já caminhou nesta direção e me indique algum caminho das pedras…
Infelizmente não estou querendo ficar fazendo testes, pois o tempo é curto.

mas obrigado pelas dicas.

Se alguém puder ajudar aí …
:roll:

ps.: Quando o material que vc vai postar estiver pronto coloca o link aí…

Valews!

Miltex

Hebert Coelho:
Miltex:
Hebert Coelho:
Basta você não repassar o EM para outras threads.

O EMF não vai repassar o mesmo EM duas vezes seguidas.

Então, se eu tiver, por exemplo, 100 requisições a aplicação (servidor) serão criados 100 EM ??? é isso msm ???

Quem deve gerenciar isso, a aplicação ou próprio framework (EclipseLink) já deixa isso transparente para o desenvolvedor.

E com relação a concorrência e manter a integridade do BD ??? Vi que podemos utilizar estratégias; pessimista ou otimista, para garantir que os objetos
gerenciados por EM diferentes não sofram acessos simultâneos e tirem a consistência do objeto que está no contexto das duas instancias dos EMs.

Pq você não faz o teste? Faz um for nesse método e chama 1000 vezes por exemplo e compare os EntityManagers que foram retornados.

Quanto a Concorrencia do DB você pode implementar as estratégias que você citou numa boa com JPA. A estratégia em si não é afetada por um EMF único ou não.

eh !

Tive que fazer o teste, uma unica fabrica cria vários EMs.

mas o problema ainda é: Como estes EMs trabalham concorrentemente ???
tipo:
um EM tem um estado do BD e outro EM tem outro estado… como gerenciar isto ???
Eu preciso me preocupar com isso ???

ou a especificação já cuida disto para o desenvolvedor ???
:?:

Criado 17 de outubro de 2012
Ultima resposta 18 de out. de 2012
Respostas 13
Participantes 3