Donc, si je comprends bien, tu as deux applications indépendantes, qui communiquent via une base de donnée?
En SQL, il existe quelque chose d'intéressant qu'on appelle une transaction.
Ce mécanisme permet de grouper des requêtes de façon à ce qu'elle soit toute réussies ou annulées en même temps.
Les autres requetes ne peuvent percevoir que les données comme si elles étaient avant la transaction (même si une partie de celle-ci est en cours), et ce jusqu'à la fin de la transaction.
Mieux, la transaction posant des verrous, il n'est pas possible de modifier les données qu'une transaction modifie.
Du coup, tu n'as même plus vraiment besoin d'un mécanisme de communication entre les applications.
Mathématiquement parlant, tu as trois fonctions du temps (des suites, puisque le temps est discret, dans ton cas)
- entrées(t)
- sortie(t)
- forçage(t)
Tu as aussi les propriétés suivantes:
- sortie(t) = application1(entree(t))
- entre(t+1) = application2(sortie(t), forçage(t+1))
Actuellement, tu as deux fonctions main():
programme1() {
while (fin du temps?) {
attendre que les entrées soient prêtes
les lire dans la base de données
calculer les nouvelles sorties
les écrire dans la base de données
signaler que les sorties sont prêtes
}
}
programme2() {
while (fin du temps?) {
attendre que les sorties soient prêtes
les lire dans la base de données
lire les forçages
calculer les nouvelles entrées
les ecrire dans la base de données
signaler que les entrées sont prêtes
}
}
A part l'inversion des mots "sorties" et "entrées", les programmes sont structurellement identiques. Surtout si on considère les forçages comme une entrée.
Imagines que tu places dans la base deux données particulières: les timestamp d'écriture des entrées et des sorties.
Alors la partie "attendre" serait simplement une boucle où tu vérifies si la date de création des données utilisées est plus récentes que la date de la dernière utilisation.
Par ailleurs, en ne faisant qu'un seul programme, ca pourrait être plus souple:
programme1() {
lire les entrées dans la base
while (fin du temps?) {
lire les forçages
calculer les nouvelles entrées
calculer les nouvelles sorties
les écrire dans la base de données
}
}
Ca demandera certainement un ajustement pour la détermination des conditions initiales, mais c'est l'idée générale.
Ta base ne sert alors plus que de support d'information externe.
Une base de donnée reste plus lente qu'un simple fichier, et encore plus que la mémoire vive.
Si tu ne conserve pas d'historique des données, alors c'est plus lent qu'un fichier écrit à la fin de l'exécution du programme, pour un résultat identique.
Partager