Juste comme ça... Quand vous avez passé au peigne fin l'appli, vous avez vérifié quoi ?
Si vous n'avez vérifier que des trucs bête genre que toute connection / commande ouverte était bien fermée après utilisation, c'est un coup d'épée dans l'eau.
En effet, que ce soit Java ou JDBC, les deux s'en occupent très bien (connectionTimeOut / commandTimeOut / garbage collector)
Au pire, vous auriez un ralentissement de l'appli.
Donc c'est pas ça qu'il faut recherche.
Je ne maîtrise pas Java du tout, et pas plus JDBC, par contre, une chose qui est sûre, c'est qu'ils permettent de faire la même chose qu'en VB/C++ avec une connection OLE/ODBC.
DONC. Par exepérience, ce qui peut faire des deadlock :
-> Vérifier que vous n'avez des transaction qu'aux endroits absolument nécessaires, ET que tout le lot est éxécuté d'un coup. Il ne faut pas commencer une transaction sur un écran et la finir sur un autre écran : si la personne part boire un café, l'ensemble des lignes touchées par la transaction sont lockées jusqu'à ce qu'elle revienne.
-> Si JDBC ne fonctionne pas en AUTO COMMIT, alors forcez-le immédiatement : avec OLEDB, si on le désactive, le COMMIT est fait uniquement lorsqu'on ferme la connection (c'est très con mais c'est comme ça). Vu que ça génère une transaction, vous imaginez les problèmes sous-jascents.
-> N'utilisez PAS de curseur dynamique, c'est à dire des curseurs qui permettent des modifications et des mises à jour "en live" depuis un objet DataGrid par exemple. En effet, ça génère, en plus de transactions, carrément des LOCK.
Maintenant, imagine :
J'ai un DataGrid qui fait un lock sur la table "facture".
Lorsque je met à jours les lignes de "facture", alors je met à jour aussi la table "client" (un compteur ou autre) par trigger.
Pendant que je suis en train de bosser sur ma facture, une autre personne lit sa fiche client, et change le status de l'utilisateur. Cependant, il n'est pas sûr, donc avant de valider, il veut vérifier les factures et... tente d'ouvrir celle que le premier utilisateur modifie.
Là, proutch, les deux sont bloqués.
=> L'utilisateur 1 ne peux pas valider car le trigger est blocké par le lock sur le client
=> L'utilisateur 2 ne peux pas accéder à la facture car elle est en cours de modif et la ligne est donc lockée.
Si le code ne gère pas proprement le code, permettant d'annuler la dernière action dans la base et en forçant l'un d'eux d'annuler ses modif, t'as un dead lock et c'est fini.
Bref, aucun lock explicit, aucun truc bizarre dans l'appli, et pourtant ça merde.
Message édité par Arjuna le 18-08-2005 à 14:51:58