Salut à tous,
J'ai une question algo d'ordre général. Voici rapidement le contexte. J'ai un serveur de base de données (MSSQL Server) et un serveur frontal pour attaquer cette base de données. Ceci permet de fournir une librairie permettant d'interagir avec la base sans avoir à faire de SQL mais uniquement par le biais d'une librairie orientée objet (au fait, nous sommes en Java).
Dans mon application, j'utilise donc la librairie (dblib.jar par exemple) pour accéder à ma base et remonter les données sous forme d'objets (des "DBObject" par exemple). Pour savoir quand un objet est supprimé/modifié ou créé en base, il faut donc que j'écoute les événements de mon serveur frontal. A ce dessein, la couche de persistence de mon application contient un cache de DBObjects.
Le problème c'est que pour modifier un objet dans mon serveur frontal, je dois donner un "delta" et non pas l'objet tel qu'il devrait être. C'est à dire ne fournir au serveur que les données qui ont changé, que celles ajoutées et que celles supprimées. L'invariant n'est pas transmis. Donc entre le moment où je crée mon "delta" et le moment où la librairie 'dblib.jar' se charge de transmettre ma requête, la base de donnée a été mise à jour par quelqu'un d'autre et ma requête est refusée. Par exemple si je dis qu'une variable "A" est ajoutée dans mon delta alors qu'elle existe déjà en base mais que je n'étais pas encore au courant, ça va planter ma requête. C'est sans doute un problème courant et j'aimerais avoir des avis sur ce genre de choses.
La solution la plus bidon : refaire la requete quand on détecte une désynchro (et on la détecte facilement, l'exception renvoyée dans ce cas est très éloquente). Je précise que l'architecture ne peut être changée, notre produit se base sur une architecture dont nous ne sommes pas propriétaires.
Merci à tous les motivés du lundi qui auront le courage de tout lire![]()
Partager