[Resolvido] Problema com recurso XA em 2 EJBs  XML
Índice dos Fóruns » Java Enterprise Edition (Java EE)
Autor Mensagem
andersonrc
JavaTeenager
[Avatar]

Membro desde: 10/05/2009 10:21:58
Mensagens: 169
Localização: João Pessoa
Offline

Olá a todos.

Estou com um problema relacionado a EJB. Eu tenho 2 EJBs, um Bancario e outro OperadoraCelular. O componete bancário deverá fazer uso do componente Operadora de celular. E aplicação cliente deve ter acesso apenas ao componente bancário.

Eu já testei os 2 módulso EJBs separadamente, e eles funcionam perfeitamente. O problema é quando eu executo a aplicação cliente na situação descrita acima, cada componente EJB possui seu banco de dados. Na situação atual o OperadoraCelular deve persistir no MySQL e o Bancario deve persistir no Derby. Já tentei no Derby, MySQL e PostgreSQL, e nada. Os 2 EJBs estão no mesmo servidor de aplicação, que é o Glassfish, o 2 bancos de dados também estão na mesma máquina.

Sempre tá dando esse problema aqui Local transaction already has 1 non-XA Resource: cannot add more resources.

Algúem sabe como posso resolver esse problema de XA para que seja possível suportar transações distribuídas?

Trecho da excessão está abaixo.

This message was edited 1 time. Last update was at 05/01/2012 10:12:23

[Email]
jaziel.rc
JavaChild

Membro desde: 19/08/2010 12:02:02
Mensagens: 141
Offline

Seu datasource ( um deles pelo menos) é um datasource XA ??? Para esse tipo de transação, envolvendo mais de um banco de dados é preciso que (n-1) datasources sejam XA, para se ter o Two-phase commit (2PC). De uma procurada no google, mesmo pq eu não entendo muito disso, fiz apenas algumas testes nessa situação.
andersonrc
JavaTeenager
[Avatar]

Membro desde: 10/05/2009 10:21:58
Mensagens: 169
Localização: João Pessoa
Offline

jaziel.rc wrote:Seu datasource ( um deles pelo menos) é um datasource XA ??? Para esse tipo de transação, envolvendo mais de um banco de dados é preciso que (n-1) datasources sejam XA, para se ter o Two-phase commit (2PC). De uma procurada no google, mesmo pq eu não entendo muito disso, fiz apenas algumas testes nessa situação.


Opa,

nenhum dos 2 é datasource XA, continuo vasculhando no google, já vi vários tópicos sobre esse assunto, mas não achei ainda nehuma forma de configurar isso ou baixar algum driver XA
[Email]
andersonrc
JavaTeenager
[Avatar]

Membro desde: 10/05/2009 10:21:58
Mensagens: 169
Localização: João Pessoa
Offline

Consegui pelo método das tentativas;

Deu um pouco de trabalho, até porque não encontrei tutorial algum explicando como resolver.

Há duas formas de resolver:

1ª opção: é só ir no browser e acessar o Glassfish pela url localhost:4848. Chegando lá, ir até a opção JDBC - Grupo de Conexões JDBC. Em nome do grupo, provavelmente deve aparecer várias opções, é só clicar no pool que vc queira que ele passe a fazer transação XA. Daí vai para uma tela Edit JDBC Connection Pool. Como aqui utilizei o banco de dados Derby, no campo Tipo de recurso: está javax.sql.DataSource e em Nome de classe da fonte de dados: está org.apache.derby.jdbc.ClientDataSource. Então é necessário alterar ambos os campos respectivamente para javax.sql.XADataSource e org.apache.derby.jdbc.ClientXADataSource, depois é só clicar no botão salvar.

Se forem duas aplicações distribuídas, só é necessário fazer essa configuração em apenas uma aplicação, mas não há problema algum em alterar essas configurações em ambas. Depois de feita as alterações é só colocar a aplicação pra rodar. Caso continue dando erro, reinicie o Glassfish.

Ou 2ª opção: poderá alterar os arquivos glassfish-resources.xml. Dentro deste arquivo, procurar por datasource-classname="org.apache.derby.jdbc.ClientDataSource" e alterar para datasource-classname="org.apache.derby.jdbc.ClientXADataSource" e procurar por res-type="javax.sql.DataSource" e alterar para res-type="javax.sql.XADataSource"
[Email]
 
Índice dos Fóruns » Java Enterprise Edition (Java EE)
Ir para:   
Powered by JForum 2.1.8 © JForum Team