Controle de transação sem EJB

Galera,

Como vocês costumam fazer controle transacional nas suas aplicações, sem o uso de EJB (EJB Container)?

As nossas aplicações antigas foram não tão bem arquitetadas e fazem algo mais ou menos assim:

No Action ou Delegate:conn = getConnectionDeAlgumLugar(); try { MeuDao dao = new MeuDao( conn ); dao.inserir( xyz ); OutroDao odao = OutroDao( conn ) ; odao.update( xxx ); conn.comit(); } catch( Exception e ) { conn.rollback(); }

Como vocês costumam fazer isso?

Eu imagino que a responsabilidade de pegar (criar/solicitar) uma conexão seja da classe DAO e não da Action ou Delegate, certo?

Até pensei em criar uma classe Transaction que faria o controle da transação e trabalharia direto com o DAO. Algo mais ou menos assim:

UmDAO dao = new UmDAO(); Transaction t = dao.beginTransaction(); try { dao.insert( xyz ); OutroDAO odao = new OutroDAO(); odao.useTransaction( t ); odao.update( xxx ); t.commit(); t.end(); } catch( Exception e ) { t.rollback(); }

Que tal?

Eu uso o padrão do “Transactional Command”.
Crio comandos que são executados dentro de um contexto transacional.

Simples assim. Funciona bem e coloca todo controle de transações, e gerenciamento de recursos associados, em um local só.

Voce tambem pode botar uma boina, usar uma gola role e dizer “afe, que coisa mais anos 90, eu faco isso tao melhor com o Spring*, ui!”…

  • = ou qualquer outro container de injecao de dependencias, mas o Spring ja vem com isso embutido, e pronto pra usar,

[quote=cv]Voce tambem pode botar uma boina, usar uma gola role e dizer “afe, que coisa mais anos 90, eu faco isso tao melhor com o Spring*, ui!”…
[/quote]

Mas isso também depende muito do ambiente de desenvolvimento que você está. Nos atuais projetos que eu tou trabalhando seria mais dificil conseguir poder usar o springfranework e instegrá-lo à plataforma que re-escrever todo pacote de gerenciamento de transações dele.

Mas que usar o spring é uma boa idéia, isso é.

Bem lembrado. Pior que isso eh quando os motivos nao sao tecnicos, mas sim politicos, administrativos, climaticos, etc… :roll:

Marcio Kuchma

Argh! :stuck_out_tongue:

Nada como usar IoC e AOP:

[code] private UmDao dao;

public void setUmDAO(UmDao dao) {
    this.dao = dao;
}

public void cadastrarAlgo(...) throws CadastraAlgoException {

    dao.update( xxx );

}[/code]

(no caso do spring…)

<bean id="X" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref bean="transactionManager"/></property> <property name="target"><ref local="XTarget"/></property> <property name="transactionAttributes"> <props> <prop key="cadastrar*">PROPAGATION_REQUIRED, -x.y.XYException</prop> </props> </property> </bean>
onde o transactionManager pode ser um “org.springframework.orm.hibernate.HibernateTransactionManager”, “org.springframework.transaction.jta.JtaTransactionManager”, etc.

Gerson K. Motoyama

Bem, mesmo com código legado me parece que o uso de Spring e Inversão de Controle não deve ser tão difícil… A vantagem é que já está pronto.

De q q maneira, vc poderia fazer com q sua conexão fosse finalizada/gerenciada usando um Servlet Filter…

É uma idéia para um legado qualquer.

Nos projetos atuais eu estou utilizando o iBatis DAO ( http://www.ibatis.com/common/dao.html ).

Super simples de configurar (tem um manual bem explicativo para download) e pode ser plugado no JDO, Hibernate, JDBC “classico” e no iBatis SQLMaps (no qual eu uso).

No final fica ± assim :


   DaoManager daoManager = pegaDaoManagerDeAlgumLugar();
    
    try {
      daoManager.startTransaction();
      meuDao1.inserir();
      meuDao2.excluir();
      meuDao3.alterar();   
      daoManager.commitTransaction();
   catch(Exception e) {
       //codigo para tratar a excecao
    }
    finally {
       daoManager.endTransaction();
    }

No caso o “endTransaction” verifica se foi dado “commit”, se nao foi ele automaticamente faz o “rollback”

Fala Destrão !

Eu criei um Façade base com controle de transação para um cliente da Discover, que possui os metodos getConnection(), commit(), rollback() e releaseConnection().

Ele suporta aninhamento de chamadas utilizando o conceito de Stack. Ex simplificado :

[code]public class FacadeEspecifico extends BaseFacade
{
  
   public void executarServicoPrincipal() {
       Connection conn = getConnection();
       try {
        UmDAO dao = new UmDAO();
         dao.setConnection(conn);
         dao.gravarDados();
         .............
        executarServicoAux();
        ..............
       commit();
       }
      catch (Exception e) {
       rollback();
       }
     finally {
        releaseConnection();
     }
    }

   public void executarServicoAux() 
  {
      // O Base façade utilizará a mesma connection recuperada em 
      //  executarServicoPrincipal
      Connection conn = getConnection();
      OutroDAO dao = new OutroDAO();
         dao.setConnection(conn);
         dao.gravarOutrosDados();  
       ............
   }
 }[/code]

Se tiver interesse é só falar.

abraços,

Eduardo Murai
SCJP & SCEA

Entendí Murai.
Mas no meu caso eu gostaria de abstrair esse controle de transação do tipo de acesso aos dados. Explico!

O DAO já é uma abstração para eu não me preocupar qual a fonte dos dados. Eu queria o mesmo com a transação.

Sacou? Valeu!

[quote=danieldestro]Mas no meu caso eu gostaria de abstrair esse controle de transação do tipo de acesso aos dados. Explico!

O DAO já é uma abstração para eu não me preocupar qual a fonte dos dados. Eu queria o mesmo com a transação.

Sacou? Valeu![/quote]

Mas mas … não é pra isso que serve o JTA? (Java Transaction API)

(Posso estar viajando … vc quer abstrair o controle de transação do DAO ou o modelo de transação? se for a segunda opçao acho que a JTA é pra isso, se for a primeira opção alguma soluçãozinha de IOC fica legal)

[quote=cv]Voce tambem pode botar uma boina, usar uma gola role e dizer “afe, que coisa mais anos 90, eu faco isso tao melhor com o Spring*, ui!”…

  • = ou qualquer outro container de injecao de dependencias, mas o Spring ja vem com isso embutido, e pronto pra usar,[/quote]

eu até ia dizer isto, mas sem a boina e a gola role :slight_smile:

UHAHUAHUAHUAHUAHUA

Impressao minha ou o Lipe perde o dia no google images? :stuck_out_tongue:

eu até ia dizer isto, mas sem a boina e a gola role :)[/quote]

No meu caso, eu também tiraria o “ui”… :mrgreen:

Este link: http://www.springframework.org/docs/MVC-step-by-step/Spring-MVC-step-by-step.html é um tutorial do Spring com o título: Developing a Spring Framework MVC application step-by-step. O que eu entendi é que, além de todas as características do Spring, que são abordadas neste fórum, me pareceu que o Spring também é um Framework MVC, significando que teria papel semelhante ao Struts ou Webwork, por exemplo. Alguém poderia dar uma esclarecida nesta questão?

um dos componentes do spring é um framework MVC sim :smiley:
tem até alguns recursos bem interessantes, to meio sem tempo agora, mas volto aqui depois e escrevo um pouco sobre eles :smiley:

Ok, valeu! O que eu achei interessante é que li aqui no fórum coisas boas do Webwork, como framework MVC, e do Spring, para controle de transações, mas nada ainda do Spring como Framework MVC. Penso que talvez seja interessante usar somente o Framework Spring MVC para ambas as tarefas. :?

Se nao me engano o novo site do RSJug (www.rsjug.org) esta sendo desenvolvido (acho que o próprio Urubata é quem ta tocando isso) com o Spring como o Framework MVC. É só dar uma olhada no projeto do RSJug no java net. :stuck_out_tongue:

]['s

exatamente, o site do RSJUG ta sendo desenvolvido (ta meio parado, mas eu termino uma hora destas :smiley: ) utilizando o SPring MVC e mais diversas partes do spring

quem quiser dar uma olhada é só baixar os fontes do java.net