[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 

Forum Read-Only! Check the new site and forum here!

Conexão em 2 bancos diferentes  XML
Forum Index -> Comentários Gerais
Author Message
SeuMadruga



Joined: 09/02/2007 12:29:51
Messages: 104
Offline

galera, seguinte
vou ter que abrir 2 conexões em 2 bancos diferentes, um MySQL e outro SQLServer, e minha dúvida é: como lidar com a transação nessa situação?
Eu já tinha postado essa dúvida há +- 8 meses, mas acabei nem precisando no fim, mas ficou muito confuso e acho melhor começar do zero de novo

Eu tenho o seguinte código no meu AppManager:
Code:
 public class ApplicationManager extends org.mentawai.core.ApplicationManager {
     
     @Override
     public void init(Context application) {
     	ioc("transaction", JdbcTransaction.class);
     	setDebugMode(true); // turn on debug mode... 
     }
     
     public void loadActions() {  
         // create a C3P0 connection pool...
     	ConnectionHandler connHandlerIntra = new C3P0ConnectionHandler("com.inet.tds.TdsDriver", "jdbc:inetdae://trix/intranet", "123", "123");
         ConnectionHandler connHandlerBack = new C3P0ConnectionHandler("com.mysql.jdbc.Driver","jdbc:mysql://backup.org.br:3306/alumni","123","123");
         
         // create a global connection filter...
         filter(new ConnectionFilter("connIntra", connHandlerIntra));
         filter(new ConnectionFilter("connBack", connHandlerBack));
       
         // transform Mentawai in a IOC container...
         filter(new IoCFilter());
         // auto-wiring
         filter(new DIFilter());
         // Everything that depends (needs) on a Connection will receive one
         di("connIntra", Connection.class);
         di("connBack", Connection.class);
         
         // injection
         filter(new InjectionFilter());
         
         ioc("intraDAO", IntraDAO.class);
         ioc("backDAO", BackDAO.class);
         
         
         action("/testeError", TesteErrorAction.class)
         	.filter(new TransactionFilter());
      }
 
  }
 


quando eu chamo a action /testeError, antes de chegar na action eu recebo o seguinte erro:
Code:
 javax.servlet.ServletException: Exception while invoking action testeError: JdbcTransaction does not have a connection! / java.lang.IllegalStateException / JdbcTransaction does not have a connection! / java.lang.IllegalStateException

Se não me engano, este erro acontece porque a classe Transaction procura uma conexão com a chave "connection"
o problema é: se eu tenho 2 conexões, eu não posso passar as 2 com o mesmo nome de chave, ou seja, "connection" certo?
como resolver este problema então?
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Acho que o JdbcTransaction aceita "conn" e "connection".

Fazer uma transação que involve mais de um banco é bastante complicado e foge do escopo do mentawai.

Agora se vc quiser fazer uma transação num banco ou uma transação no outro banco, então vc deve dar um jeito de passar a sua conexão para dentro do JdbcTransaction. E a maneira mais fácil de fazer isso é colocar uma a connection de novo no input da action com o nome conn.


Sergio Oliveira

SeuMadruga



Joined: 09/02/2007 12:29:51
Messages: 104
Offline

isso
eu não preciso fazer uma transação que envolve + de 1 banco
o que eu preciso é fazer uma transação em 1 ou no outro
mas eu não entendi muito bem o que eu teria que fazer
seria +- isso?
Code:
 filter(new ConnectionFilter("conn", connHandlerIntra));
 filter(new ConnectionFilter("connection", connHandlerBack));
 
 di("conn", Connection.class);
 di("connection", Connection.class);
 


é algo +- assim ou eu to viajando forte?
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Não pensei muito bem nisso, mas imagino que vc tem que dar um jeito de colocar a conexão no input como "conn".

Algo como: input.setValue("conn", input.getValue("connIntra"));


Sergio Oliveira

IceW0lf


[Avatar]

Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline

Hummm.... Se isso funcionar...

Vou precisar disto futuro.

Seu Madruga, cara se funcionar o q Sérgio disse, q tal tu postar um texto como um tutorial, o Sérgio pode até colocar com um FAQ bacana.

E se funcionar... é simplemente SHOW DE BOLA... + 1 Ponto dos milhares de pontos que ele vem ganhando com nós usuários.


Leiber Wallace
Voixy ::: Soluções em Telecomunicações
SeuMadruga



Joined: 09/02/2007 12:29:51
Messages: 104
Offline

até topo se eu conseguir fazer funcionar, mas primeiro preciso entender bem como tudo funciona hehe
Sérgio, esta linha que vc passou
Code:
input.setValue("conn", input.getValue("connIntra")); 

não entendi onde vc colocaria ela. O único lugar que me ocorreu é se eu criar um filtro que seja executado antes do TransacionFilter e nele inserir este comando
IceW0lf


[Avatar]

Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline

Acho q é na ACTION pq é lá que normalmente se trabalha com:
input e outputs com o input.getValue.

Ahh quanto ao FAQ faz simples...

- Mostra como configurar os dois bancos;
- Mostra os IoC, DI, etc.. que existir; e
- Mostra como utilizar um ou outro.

Leiber Wallace
Voixy ::: Soluções em Telecomunicações
SeuMadruga



Joined: 09/02/2007 12:29:51
Messages: 104
Offline

mas não pode ser na action, pq quando chega na action já passou pelo TransactionFilter, e eu imagino que esse comando tenha que ser rodado antes dele
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline



não entendi onde vc colocaria ela. O único lugar que me ocorreu é se eu criar um filtro que seja executado antes do TransacionFilter e nele inserir este comando
 


Exato!

Nesse filtro vc pode decidir qual conexão pegar e colocar como "conn" no input.

Vc pode passar no construtor do Filtro qual connection pegar, se a connIntra ou a outra lá...

Sergio Oliveira

SeuMadruga



Joined: 09/02/2007 12:29:51
Messages: 104
Offline

ok
vou fazer o teste aqui e já dou a resposta
mas digamos que eu quisesse ter conexões diferentes em 3 bancos
neste caso eu não conseguiria injetar a 3ª conexão através do menta certo? já que o JdbcTransaction só aceita 2 nomes de chave
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

SeuMadruga wrote:
ok
vou fazer o teste aqui e já dou a resposta
mas digamos que eu quisesse ter conexões diferentes em 3 bancos
neste caso eu não conseguiria injetar a 3ª conexão através do menta certo? já que o JdbcTransaction só aceita 2 nomes de chave 


O que vc falou não tem sentido.

O JdbcTransaction aceita UMA conexão apenas.

Os nomes pelos quais ele aceita injeção automática é "conn" e "connection".

O que vc está fazendo é um filtro para dizer qual conexão vai ser injetada das N que vc tem.

Sergio Oliveira

SeuMadruga



Joined: 09/02/2007 12:29:51
Messages: 104
Offline

é
fazendo as coisas aqui acabei de perceber
posso ter N conexões, e a partir do filtro escolher a que vai ser utilizada

eu estava realmente entendendo errado, achando que o JdbcTransaction podia aceitar as 2 conexões
Jtiago



Joined: 24/09/2007 15:14:33
Messages: 3
Offline

SeuMadruga como ficou essa história ae das conexões?
Funcionou ou tu largou de mão?

Tiago Silveira
--------------------------------
www.jtiago.com
[WWW] [MSN]
Silvio Pereira



Joined: 14/03/2008 06:18:57
Messages: 12
Offline

Como ficou o tópico. Estou precisando implementar acesso a dois bancos diferentes na mesma apliacação. Porém, mesmo definindo conn e connection para cada bando só é injetado a conexão conn. Baixo meu appicationManager:

ConnectionHandler connHandler = new C3P0ConnectionHandler("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/portal?autoReconnect=true", "root", "xxx");
ConnectionHandler connHandlerRelatorio = new C3P0ConnectionHandler("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/relatorio?autoReconnect=true", "root", "xxx");


filter(new ConnectionFilter("conn", connHandler));
filter(new ConnectionFilter("connection", connHandlerRelatorio));
filter(new IoCFilter());

...

// auto-wiring
filter(new DIFilter());

di("conn", Connection.class);
di("connection", Connection.class);
[Email] [WWW] [MSN]
 
Forum Index -> Comentários Gerais
Go to:   
Powered by JForum 2.1.6 © JForum Team