| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/03/2009 09:38:25
|
GraveDigger
JavaEvangelist
![[Avatar]](/images/avatar/3332880692313818482a5a0286608ab6.jpg)
Membro desde: 07/07/2005 13:47:12
Mensagens: 354
Localização: Aracajú
Offline
|
E ai pessoal, blz?
Tenho a seguinte situação:
Trabalho com um sistema onde cada cliente tem um schema no banco de dados e temos um global.
Tudo estava funcionando mto bem até que cheguei a seguinte situação:
Preciso que: dentro de um método, primeiro eu faça uma consulta no banco A, dps uma inserção no banco B.
Estou tendo um problema :
org.jboss.util.NestedSQLException: Transaction is not active
Fazendo alguns testes notei que isso ocorre porque ele cria uma nova transação e isso essa transação para conectar no banco A, mas não cria outra para o banco B.
Assim sendo, depois de fazer minha consulta no banco A, não consigo fazer mais nada no banco B.
Eu poderia:
1) Cria a transação manualmente(péssimo)
2) Colocar a parte que consulta o banco A em outro método que cria uma nova transação para isso(não tão ruim, mas ainda ruim)
Andei lendo um pouco sobre XA e acho que seria o caso de usar aqui, alguém sabe me dizer se ela se encaixaria nesse caso?
Esse tipo de cenário será bem comum em meu projeto, ter q trabalhar com mais de um banco e fazer com que tudo seja uma única transação.
Alguém tem algum exemplo de como configurar o hibernate para trabalhar assim ? Algum link, qq coisa ajuda, dei uma olhada na net mas sequer sei se XA se encaixa nesse meu cenário.
Grato,
|
SCWCD
SCJP
Pedro Henrique Lobato Sena
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/03/2009 16:36:29
|
ffranceschi
JavaChild
![[Avatar]](/images/avatar/c80bfa00454a7564c07c0559808294fa.jpg)
Membro desde: 23/08/2006 11:07:21
Mensagens: 130
Offline
|
O JTA que vai te ajudar bastante nisso
XA é pra fazer esse tipo de operacao de two-phase commit (2PC)
Dá uma olhada em http://www.infoq.com/minibooks/JTDS , tem um capitulo só de XA lá
Abraços
|
Fernando Franceschi
Blog - http://ffranceschi.wordpress.com/
Twitter - http://twitter.com/ffranceschi1 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/03/2009 16:48:02
|
GraveDigger
JavaEvangelist
![[Avatar]](/images/avatar/3332880692313818482a5a0286608ab6.jpg)
Membro desde: 07/07/2005 13:47:12
Mensagens: 354
Localização: Aracajú
Offline
|
To baixando o PDF.
Qndo eu tiver uma solução posto aqui.
Valeu a força
Pedro Sena
|
SCWCD
SCJP
Pedro Henrique Lobato Sena
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/03/2009 20:15:24
|
luBS
JavaBaby
Membro desde: 10/05/2006 14:00:27
Mensagens: 86
Localização: São Paulo
Offline
|
Oi,
Não é muito complicado não, como o ffranceschi falou, vc precisa usar JTA e seus datasources tem que ser XA.
Segue um exemplo do arquivo datasource que faço deploy no jboss:
Depois disso é só usar a transação do servidor de aplicação. Se estiver usando jboss, da uma lida nisso: http://docs.jboss.org/jbossas/jboss4guide/r5/html/ch4.chapt.html
Se vc estiver usando o Spring, ele pode gerenciar suas transações, segue um exemplo configuração para obter o entityManager:
Você pode configurar vários entity manager (igual o configurado no exemplo) cada um acessando um persistent unit diferente e depois usar as anotações @Transactional e @PersistenceContext (nessa ultima indicando o unit-name) que o spring já faz tudo para vc.
Ah, no seu persistence.xml o transaction-type tem que ser "JTA".
Aqui nos temos casos também de duas aplicações em servidores separados, acessando bases diferentes e se comunicando através de EJB, tudo transacional. Caso precise disso e estiver usando jboss, aqui explica como faz
http://www.jboss.org/community/docs/DOC-13179
Espero ter ajudado.
|
http://luizroos.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/03/2009 20:41:05
|
GraveDigger
JavaEvangelist
![[Avatar]](/images/avatar/3332880692313818482a5a0286608ab6.jpg)
Membro desde: 07/07/2005 13:47:12
Mensagens: 354
Localização: Aracajú
Offline
|
Opa luBS,
Obrigado pelas dicas, tendo algum exemplo assim fica mais fácil
Vou tentar amanhã e posto os resultados.
Obrigado novamente e abs,
Pedro Sena
|
SCWCD
SCJP
Pedro Henrique Lobato Sena
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/03/2009 07:10:58
|
GraveDigger
JavaEvangelist
![[Avatar]](/images/avatar/3332880692313818482a5a0286608ab6.jpg)
Membro desde: 07/07/2005 13:47:12
Mensagens: 354
Localização: Aracajú
Offline
|
luBS,
Quando tento inserir, no meu xa-datasource a tag:
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
Dá um erro no meu jboss. Por isso estou usando sem essa opção. Fiz as adequações no datasource e no hibernate mas o erro persiste.
Você pode dar um exemplo de algum método onde vc está usando a capacidade de XA transactions? Acredito que o problema esteja em meu método...
Só para tirar a dúvida.
Grato
|
SCWCD
SCJP
Pedro Henrique Lobato Sena
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/03/2009 14:29:00
|
luBS
JavaBaby
Membro desde: 10/05/2006 14:00:27
Mensagens: 86
Localização: São Paulo
Offline
|
Mostra ai seu método e também como vc esta fazendo begin e commit na transação.
|
http://luizroos.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/03/2009 14:36:04
|
GraveDigger
JavaEvangelist
![[Avatar]](/images/avatar/3332880692313818482a5a0286608ab6.jpg)
Membro desde: 07/07/2005 13:47:12
Mensagens: 354
Localização: Aracajú
Offline
|
Opa,
Consegui resolver aqui.
Meu problema era o seguinte:
Eu acessava 2 schemas diferentes do banco(O user tem permissão para tal).
Isso funciona bem para select(consigo dar um join cross-schema) mas nao funciona pra insert,update,delete(claro, transação cross-schema não rola sem XA).
O que eu fiz:
Agora tenho 2 tipos de DAOs, os que puxam do banco do cliente, e os que puxam do banco global.(Obviamente global tem suas entidades e local tem outras)
Agora tudo está funcionando corretamente.
Obrigado pela ajuda,
Pedro Sena
|
SCWCD
SCJP
Pedro Henrique Lobato Sena
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/04/2010 22:54:17
|
rafael.espiritosanto
JavaGuru
![[Avatar]](/images/avatar/28bbd522fee8ef2020ff5828be644942.jpg)
Membro desde: 27/07/2006 10:51:26
Mensagens: 226
Localização: Rio de Janeiro
Offline
|
Pessoal, tô aproveitando este tópico pq o meu problema tem a ver com o assunto.
Eu tô usando o JBoss AS 5.1GA. Tentei criar dois data sources usando <xa-datasource> mas estou com um problema estranho.
Por algum motivo, o Eclipse está reclamando da estrutura do arquivo ds.xml
Eu estou colocando em anexo o printscreen do eclipse com a mensagem de erro.
O Curioso é que eu peguei um exemplo da página da JBoss e o erro é o mesmo.
Existe alguma coisa que estou vacilando ou é algum bug do eclipse? (Eu estou usando o plugin JBoss Tools 3)
Eu tentei acessar a DTD pelo browser mas houve um erro no parser do documento...
Aqui esta a estrutura completa do arquivo ds.xml
Outra dúvida: O fato de estar usando XA requer que o arquivo tenha o nome no formato XXX-xa-ds.xml? Ou posso deixar como XXX-ds.xml?
Obrigado!
|
| Nome do arquivo |
datasource.jpg |
Download
|
| Descrição |
Erro exibido pelo Eclipse |
| Tamanho |
223 Kbytes
|
| Baixado: |
39 vez(es) |
|
|
|
 |
|
|