Re: Gestion des exceptions en JTA / JPA

Régis Le Brettevillois <[email protected]> Thu, 24 Mar 2011 13:48:57 +0100
Newsgroups gmane.comp.java.french.general
Message-ID <[email protected]>
 On Thu, 24 Mar 2011 13:19:45 +0100, Dominique Gallot 
 <[email protected]> wrote:
>>L'utilisation du flush de cette manière est déconséillée
>
> Cela dépends. En fait le problème n'est pas tant les performances
> que les locks de rows.
> Dans les databases transactionnelles on lock le row (ou parfois les
> pages de rows sur les anciennes db sybase) lors d'une modification de
> données.
>  Si tes transactions sont longues ca pose un problème.
> D'un autre coté, déférer les modifications lors d'un flush pose
> des problèmes avec les contraintes d'intégrités de la DB.
> De plus comme tu le dit, ce n'est plus le code qui insert le row qui
> reçoit l'exception mais le code qui appelle le flush/commit.
>  Notes que ce comportement existait aussi avec les database, vu que
> l'on peut retarder le check des contraintes au niveau du commit.
> Donc comme toujours il n’y a pas de bonne façon de faire, mais des
> façons différentes qui comporteront des contraintes différentes.
>

 Effectivement, le problème est essentiellement lié à l'isolation et 
 à la cohérence de la transaction.
 Maintenant, l'opération de flush (et non pas de commit) devrait se 
 comporter de la même manière qu'un insert/update SQL en mode 
 autocommit off.
 Je ne connais pas l'implémentation de TopLink donc c'est difficile de 
 dire si elle est équivalente, et si elle "transactionnelle" ou pas.
 L'intérêt d'un moteur de mapping comme TopLink ou Hibernate, c'est 
 justement d'éviter de pousser des données vers la base tant qu'on a 
 pas terminé la transaction. Donc si le flush peut potentiellement 
 répondre à ta problématique, il n'est pas trop dans l'esprit des 
 mécanismes mis en oeuvre.

>>Sinon je verrais bien un convertisseur d'exception au niveau d'un
> intercepteur au dessus de la couche service ?
>

 Si vous considérez que le boulot de pousser l'information vers la BDD 
 est du ressort du framework Toplink on arrive donc au problème 
 évoqué.
 Les erreurs de contraintes (unicité, dépendances, etc) apparaissent 
 donc au moment du commit, ce qui n'est pas facile à gérer puisque 
 généralement c'est Spring qui s'en occupe (je suppose que vous 
 utilisez le mode de transaction implicite).
 Le framework Spring fournit une interface qui permet de participer au 
 protocole transactionnel et donc de potentiellement intercepter les 
 erreurs au moment du commit/rollback. Si je ne me trompe l'interface est 
 TransactionManager qui dans le cas de TopLink sera injectée sous la 
 forme TopLinkTransactionManager, pour intercepter les exceptions il 
 devrait être possible d'implémenter une version de cette interface qui 
 délèguerai au TopLinkTransactionManager.
 

 Régis