Hibernate + Transação em 2 bancos diferentes. XA transaction?  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
GraveDigger
JavaEvangelist
[Avatar]

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

ffranceschi
JavaChild
[Avatar]

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
[WWW]
GraveDigger
JavaEvangelist
[Avatar]

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

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/
GraveDigger
JavaEvangelist
[Avatar]

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

GraveDigger
JavaEvangelist
[Avatar]

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

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/
GraveDigger
JavaEvangelist
[Avatar]

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

rafael.espiritosanto
JavaGuru
[Avatar]

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!
[Thumb - datasource.jpg]
 Nome do arquivo datasource.jpg [Disk] Download
 Descrição Erro exibido pelo Eclipse
 Tamanho 223 Kbytes
 Baixado:  39 vez(es)

[MSN]
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team