Bonjour,

Je fais un soft en java qui doit tourner en parallèle sur deux machines, selon une logique de cluster: le soft récupères des infos sur plusieurs tâches à effectuer dans une série de tables (base Oracle), traite les tâches puis revient en prendre d'autres. Il faut absolument une exclusion entre les deux instances sur les deux machines: une même tâche ne doit être traitée que par une des deux instances en même temps.

Pour celà j'aimerais utiliser les lock de table oracle. Je me suis crée une table "LOCKED_TASKS" dans laquelle je rentre les identifiants des tâche en cours de traitement par une des deux instances.

Ainsi, lorsque le soft choisi les tâche à effectuer, il exclue celles qui se trouvent dans la table LOCKED_TASKS - car si elles y sont, c'est qu'elles sont en cours de traitement par l'autre instance.

Afin d'être sûr qu'une instance ne va pas insérer des lignes dans LOCKED_TASKS pendant qu'une autre les lis, je consulte la table à l'aide d'un SELECT.... FOR UPDATE:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
Statement st= cnx.createStatement();
resultQueryLock=st.executeQuery("select * from LOCKED_TASKS for update");
Ensuite j'ai du code pour sélectionner mes tâche et exclure celles que m'a ramené la requête ci-dessus. Une fois selectionnées, je les rentre dans LOCKED_TASKS pour les verrouiller:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
PreparedStatement stLock=cnx.prepareStatement("Insert into LOCKED_TASKS (ID, agent) values (?,?)");
stLock.setInt(1, Integer.parseInt(selectedTask.getId()));
stLock.setString(2, ParamManager.getParameter("agentName"));
Et enfin je commit la transaction:

D'après la théorie, le commit devrait relacher le lock mis en place par le select... for update. Seulement voilà, il ne le fait pas!! Le commit est bel et bien exécuté car les lignes de l'insert apparaissent bien dans la table (je peux les voir avec sqlDeveloper par exemple) mais la table est toujours lockée: l'autre instance bloque dessus...

Savez vous s'il y a des bugs connus au niveau des lock en base à travers JDBC et oracle?? Sinon, connaitriez vous un autre moyen de faire de l'exclusion mutuelle en cluster que de passer par la base?

D'avance merci!!

PS: j'ai bien ceci au moment d'ouvrir ma connexion:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
conn.setAutoCommit(false);