2010-11-18 27 views
1

Supposons que je la structure suivante dans mon projet (j'utilise iBatis comme DAO):Comment résoudre un problème de transactions imbriquées avec iBatis?

public class UsersManager { 
    public void do { 
     mySqlMapClient.startTransaction(); 
     // my code here 
     mySqlMapClient.endTransaction(); 
     mySqlMapClient.commitTransaction(); 
    } 
} 

public class StatsManager { 
    public void do { 
     mySqlMapClient.startTransaction(); 
     // my code here 
     mySqlMapClient.endTransaction(); 
     mySqlMapClient.commitTransaction(); 
    } 
} 

public class App { 
    public void do { 
     myUsersManager.do(); 
     myStatsManager.do(); // here I get an exception, because the transaction is already started 
    } 
} 

Alors, ma question est, comment puis-je résoudre ce problème? J'ai plus de 150 transactions dans mon projet, donc ce n'est pas une solution facile pour réécrire toute la logique biz. Y at-il une approche standard pour des situations comme celle-ci et où dois-je regarder?

Répondre

3

Vous ne devriez pas avoir de logique de transaction dans les DAO pour exactement cette raison.

Généralement, il existe une couche de service qui possède la connexion à la base de données et l'unité de travail. Il démarre la transaction, appelle tous les DAO participants et nettoie une fois la transaction terminée.

Le framework Spring utilise des aspects pour implémenter la logique transactionnelle. Vous auriez des interfaces pour tous ces DAO. Spring générerait un proxy qui gérerait la transaction de manière déclarative. Peut-être pourriez-vous utiliser certains de ces concepts, même si vous n'utilisez pas Spring.

Ou tout simplement apprendre le printemps. Il supporte bien iBatis.

+0

Eh bien, la prochaine chose que je ferai est d'apprendre le printemps. Cependant, j'ai déjà pris en compte que j'ai un énorme problème de conception mettant mes transactions dans les DAO. – Michael

+0

En tout cas, merci beaucoup pour votre réponse. – Michael

+0

Cela pourrait valoir le refactoring. Pensez à combien votre code sera plus petit si la logique de transaction est dans un endroit au lieu de 150 classes. C'est ce que la programmation orientée aspect peut faire pour les préoccupations transversales. Les transactions sont une; la journalisation en est une autre. Vous pourriez trouver que le mettre dans Spring iBatis n'est pas aussi difficile que vous l'imaginez. – duffymo