| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2007 09:00:02
|
Luiz_Gustavo
Virtual Machine Man
![[Avatar]](/images/avatar/012d9fe15b2493f21902cd55603382ec.png)
Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline
|
Bom dia galera,
alguém já conseguiu fazer, ou sabe se é possível, mudar em tempo de execução os dados da conexão com o banco de dados usando a JPA?
Obtenho a conexão através de de um recurso do servidor (a aplicação está publicada no glassfish). Esta conexão tem um usuário padrão, descrito no sun-resources.xml.
O caso é que, para cada usuário do sistema, existe um usuário paralelo no banco de dados, e após o processo de login o usuário de banco de dados referente ao usuário do sistema passa a ser usado para obter as conexões.
Isso acontece pois as permissões são controladas via triggers, baseadas no usuário da conexão.
Para quem se perguntou o motivo de estar sendo feito assim, explico: é uma migração... e precisamos manter esse esquema.
Abraços!!
|
Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2007 12:31:56
|
joede.fadel
Virtual Machine Man
![[Avatar]](/images/avatar/9729c9467900e712f46044a2e54da67f.jpg)
Membro desde: 15/08/2007 00:42:59
Mensagens: 536
Localização: Curitiba/Pr
Offline
|
tem como sim
This message was edited 1 time. Last update was at 13/12/2007 12:32:56
|
Joe S2 Jo
UTFPR - Universisdade Tecnologica Federal do Paraná
Java-PHP-PL/SQL |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2007 15:17:06
|
Luiz_Gustavo
Virtual Machine Man
![[Avatar]](/images/avatar/012d9fe15b2493f21902cd55603382ec.png)
Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline
|
Opa.... fiz os testes aqui e deu certo.
A questão agora é que tenho que abrir mão da injeção automática de EntityManagers, certo?
O problema que isso me causa é na propagação de transação.
Tenho a seguinte situação (vou ignorar os detalhes irrelevantes no exemplo que vou apresentar, pra passar só a idéia principal):
no caso, transacaoBegin() seria um entityManager.getTransaction().begin().
preciso estender esta transação para os demais beans sem estado... e pelas anotações creio que não é possível.
Alguma sugestão galera?
|
Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2011 10:39:21
|
ederfreitas
JavaTeenager
![[Avatar]](/images/avatar/23b618784dfc816fdc6571427206ee16.jpg)
Membro desde: 07/01/2011 11:21:28
Mensagens: 153
Localização: Cascavel - PR
Offline
|
Senhores ressucitando o tópico, com a finalidade de duplicidades.
Luiz_Gustavo na época como você resolveu este problema com a possivel solucação apresentada? Estou com a mesma situação, preciso realizar conexões dinâmicas atreladas a um datasource, sem ter que gerênciar as trasações manualmente, quero que isso continue sendo feito pelo container. Sabem me dizer se JPA 2 tem algo nativo que disponibiliza tal ação?
Desde já obrigado.
This message was edited 1 time. Last update was at 07/04/2011 13:49:26
|
Eder F. Freitas
"OCJP Estudando..."
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2011 12:54:00
|
Luiz_Gustavo
Virtual Machine Man
![[Avatar]](/images/avatar/012d9fe15b2493f21902cd55603382ec.png)
Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline
|
ederfreitas,
neste projeto em que trabalhei, em um determinado momento, deixamos de usar EJB, e passamos a usar somente JPA, controlando as transações manualmente.
Para a questão de mudar dinamicamente os dados de conexão havíamos adotado a estratégia de criar instâncias de EntityManagerFactory com as configurações necessárias, mas isto nos levou a um grande problema de performance no final.
Quando se trata de EntityManagerFactory o ideal é que se tenha apenas uma instância no sistema, pois cada instância costuma ser muito cara em termos de recursos, ocupando muito espaço em memória (isso varia de acordo com o tamanho do banco).
Como criávamos um EntityMaganerFactory para cada usuário do sistema (a cada vez que um usuário realizava o login criávamos a instância personalizada e mantínhamos em um cache) em pouco tempo a memória estava cheia, com os objetos de metadados do banco.
Tentamos personalizar os dados de conexão passando propriedades no momento da criação das instâncias de EntityManager, mas não tivemos sucesso.
Um consultor que tentou nos ajudar, na ocasião, disse que havia uma forma de configurar o JBoss para que o mesmo realizasse a autenticação dos usuários, e com as mesmas credenciais fornecer as conexões ao EntityManager, de acordo com o usuário logado. Bom, a consultoria nunca conseguiu nos mostrar isso, e eu também não consegui encontrar este recurso. (A autenticação dos usuários é beleza, mas me refiro à passagem de conexões personalizadas ao EM).
Na configuração de datasource do JBoss há uma opção que permite especificar para a fábrica de conexões qual usuário e senha utilizar para recuperar conexões, mas não testei ainda para ver como isso poderia ser utilizado com o JPA:
application-managed-security: Se true, o login e senha para conexão serão fornecidos pelo código Java que requisita a conexão ao servidor de aplicações, em vez de pela definição do datasource;
|
Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2011 15:03:25
|
ederfreitas
JavaTeenager
![[Avatar]](/images/avatar/23b618784dfc816fdc6571427206ee16.jpg)
Membro desde: 07/01/2011 11:21:28
Mensagens: 153
Localização: Cascavel - PR
Offline
|
Entendo, mas a idéia permanece a de criar apenas um EntityManagerFactory, a única coisa que vai mudar mesmo é a database, pense assim, tenho um banco de dados que conterá databases diversificadas para cada cliente, cliente x acessa a database x, cliente y acessa a database ya única coisa que preciso é espeficar isso em runtime uma vez que não posso manter isso constante em um persistence.xml.
|
Eder F. Freitas
"OCJP Estudando..."
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2011 17:23:17
|
Luiz_Gustavo
Virtual Machine Man
![[Avatar]](/images/avatar/012d9fe15b2493f21902cd55603382ec.png)
Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline
|
Entendi =)
Neste caso me parece mais fácil.
Supondo que você está usando um datasource gerenciado pelo seu servidor de aplicações para obter as conexões (que é o recomendado), você terá que criar vários datasources no seu servidor, um para cada banco, dando a cada um o seu devido nome JNDI.
No seu arquivo persistence.xml você pode criar várias unidades de persistência, cada uma com um nome e referenciando um datasource diferente.
Depois você pode criar as instâncias de EntityManagerFactory, uma para cada unidade de persistência, armazenar estas instâncias em um cache, e recuperar cada uma no momento com base nos dados de login.
|
Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2011 08:38:15
|
ederfreitas
JavaTeenager
![[Avatar]](/images/avatar/23b618784dfc816fdc6571427206ee16.jpg)
Membro desde: 07/01/2011 11:21:28
Mensagens: 153
Localização: Cascavel - PR
Offline
|
Aí que está o problema não é tão fácil assim, "revirei" o Goole em busca de informações. Posso ter uma nova database a cada dia e não poderia ficar recompilando a aplicação toda vez que eu precisasse de um novo datasource, tinha que ser genérico, algo que o JPA não colaborou com nós programadores nos deixando presos a um banco de dados.
Tudo que eu preciso resume-se nisso https://community.jboss.org/message/356284, porém é bem antigo e não há nenhuma solução apresentada.
This message was edited 1 time. Last update was at 08/04/2011 08:45:51
|
Eder F. Freitas
"OCJP Estudando..."
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2011 08:44:44
|
ederfreitas
JavaTeenager
![[Avatar]](/images/avatar/23b618784dfc816fdc6571427206ee16.jpg)
Membro desde: 07/01/2011 11:21:28
Mensagens: 153
Localização: Cascavel - PR
Offline
|
´
This message was edited 1 time. Last update was at 08/04/2011 08:45:17
|
Eder F. Freitas
"OCJP Estudando..."
 |
|
|
 |
|
|