Bonjour à tous,
Un problème a été constaté lorsqu'un hard shutdown (kill du process java) est fait sur le serveur d'une application java et je ne vois pas de solution évidente (ou alors je n'y ai pas pensé^^). Je viens donc vers vous pour y trouver une solution.

Voici quelques explications:
- L'application utilise une base H2 avec auto commit (qui n'est pas la dernière version donc il faudrait que je teste avec la dernière mais je pense qu'il y aura le même type de problème)
- Lors du démarrage du serveur, un DataSource (JdbcConnectionPool dans mon cas pour h2) est créé
- A la première demande de connexion pour l'exécution d'une requête (appel à getConnection() sur le DataSource), un appel à org.h2.engine.Database.openDatabase() est fait (ce qui créé un fichier ".lock.db" dans le répertoire de la base)
- Lors de certaines requêtes d'insertion, une séquence est incrémentée dans la base h2 (car c'est un ID déclaré en AUTO_INCREMENT)
- Toutes les connexions sont bien fermées suite à l'exécution de la ou des requêtes
- Lors de l'arrêt normal du serveur, un appel à JdbcConnectionPool.dispose() est fait ce qui provoque un appel à org.h2.engine.Database.close() (le fichier ".lock.db" est supprimé dans le répertoire de la base)
- Suite à un arrêt normal, la valeur des séquences est bien sauvegardée en base
- Cependant, lors d'un hard shutdown, il n'y a pas d'appel ni à JdbcConnectionPool.dispose() ni à org.h2.engine.Database.close() ce qui fait que la valeur de la séquence n'est pas sauvegardée (elle semble être réinitialisée à sa valeur initiale) -> Cela provoque donc une incohérence entre la séquence et le dernier ID ajouté en base qui amène à une SQLException de violation de la clé primaire lors d'une tentative d'ajout

Mon idée était de détecter une commande de kill et de fermer correctement la base si tel est le cas mais je ne sais pas si c'est possible? Sinon, avez-vous d'autres idées?

Le but recherché est d'être robuste.

Merci d'avance pour votre aide .