Controle de Transação no Facade

PessoALL,

Tenho uma aplicação web que utiliza os padrões VO, BO, Facade, DAO, etc.

Estou precisando fazer um controle de transação pois tenho em uma ação, INSERT em duas tabelas e UPDATE em outra.

Tem como eu fazer o controle de transação no Facade ao invés de fazer dentro do DAO misturando no mesmo método as três queries?

Só lembrando que minha aplicação não usa EJB.

E o BD é DB2.

Alguém pode me dar uma luz se isso é possível e qual a melhor forma de fazer isso?

Um abraço a todos.

Dê uma pesquisada em User transaction.

=> Tecnicamente sim.

Como tá o seu DAO? Quem cria a sessão com banco de dados?

O Mais correto seria você criar proxyDinamico através da classe InvocationHandler. O correto seria ter o controle transacional dentro da fachada e não no DAO. Imagine o seguinte cenário: Em um facade você precise utilizar 2 DAO’s diferentes como você teria esse controle ?

No caso seria como você usar AOP dentro de seu código. A Maneira como o spring faz
Proxy.newProxyInstance(SEU BUSINESS OBJECT, new Class[]{INTERFACE_FACADE.class},new TransactionHandler(new iMPLEMENTAÇÃO_FACADE()));
}

=> Tecnicamente sim.

Como tá o seu DAO? Quem cria a sessão com banco de dados?[/quote]

Eu tenho uma classe ConnectionFactory que possui métodos como getConnection, freeConnection, etc.

Meus DAO’s fazem uso desses métodos em suas implementações.

[]'s

Rodrigo

Não sei se isso é possível no seu caso, mas eu uso o spring para controlar minhas transações…

Use seu Factory dentro de sua Facade ao invés de dentro do DAO, faça sua facade injetar a sessão que ela abrir em seus DAOs e passe a controlar de dentro da facade sua transação. Uma ideia seria passar a sessão pelo próprio construtor do DAO. Tranquilo?

Deixa eu ver se eu entendi.

Dentro do meu Factory, eu crio por exemplo um método “iniciarTransacao()”, dentro desse cara eu faço a conexão com o banco, seto o autocommit para false etc., crio um outro método para fazer o “commit” da transação e outro método para fazer o rollback, seria isso?

Não entendi direito a parte “Uma ideia seria passar a sessão pelo próprio construtor do DAO.”, pode me explicar melhor?

[]'s

Rodrigo

Qual framework de persistencia?

não, isso deve ser obrigação da sessão criada e não do factory, ele só cria a sessão para você.

[quote]
Não entendi direito a parte “Uma ideia seria passar a sessão pelo próprio construtor do DAO.”, pode me explicar melhor? [/quote]

por exemplo, se você tiver usando hibernate você hoje tá criando (chamando sua factory) suas session dentro do DAO, certo? Ao invez disso criaria na facade que passaria por parametro para seu DAO, eu só sugeri o momento de passar esse parametro que sei em sua criação (no seu construtor).

Nesse projeto não é usado nenhum framework de persistência.

Deixa eu explica melhor:
Na minha implementação de DAO eu tenho uma chamada desse tipo para pegar conexão:

Connection con = ConnectionFactory.getConnection("nomeDoPool");

A implementação do método dentro do ConnectionFactory está dessa forma:

Connection conn = connMgr.getConnection(poolName); conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); return conn;

Dentro do meu Facade eu pego a instancia do DAO e chamo os métodos que eu preciso.

Tem como eu implementar algum controle de transação não usando nenhum tipo de framework de persistência e tendo uma arquitetura como essa?

[]'s

Rodrigo

qual a dificuldade de fazer isso:

Connection con = ConnectionFactory.getConnection("nomeDoPool");  

na sua fachada ao invez do DAO? passe essa sua referência “con” para o seu DAO e para muitos outros que sua fachada precisar… logo a operação de iniciar a transação, commitar e etc podem ser feitas pela fachada.

e respondendo a sua pergunta: sim, é possível fazendo isso ai acima.