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.
:?:
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 ???
Está seria a melhor das opções apresentadas da discussão acima:
publicclassJPAHelper{privatestaticJPAHelpermyHelper=newJPAHelper();privatestaticEntityManagerFactorymyFactory=null;/** * Private constructor. Implementing synchronization with double-lock check */privateJPAHelper(){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 */publicstaticJPAHelpergetInstance(){if(myHelper==null){myHelper=newJPAHelper();}returnmyHelper;}publicEntityManagerFactorygetJPAFactory(){returnmyFactory;}
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
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
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 ???
:?: