[JAVA EE] Sessions simultanées

Fermé
TempsMort0 Messages postés 43 Date d'inscription mardi 22 janvier 2013 Statut Membre Dernière intervention 1 août 2018 - 25 juin 2018 à 16:57
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 25 juin 2018 à 18:44
Bonjour,

Me revoilà avec mon application composé d'outils et de consommables,
aujourd'hui je suis confronté à un problème différent :

J'ai deux sessions classiques : user et admin

Mon application réalise de la lecture/écriture sur un fichier Excel comme pseudo-base de données.

Le problème est que si 2 sessions sont ouvertes en même temps sur 2 machines, la première à faire l'écriture du fichier Excel aura effectuer son écriture, le 2ème utilisateur aura des valeurs faussées.

Solutions envisagées :
- Récupérer le nom des sessions actives s'il y en a et empêcher une deuxième connexion.
- Accorder les droits en lecture et non en écriture de fichier Excel pour un second utilisateur.

Le problème pour moi c'est la technique précise, je peux apporter des précisions sur mon code au besoin.

Merci d'avance.
Corentin


A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 juin 2018 à 18:44
Bonjour,

Il y a plusieurs manières de faire, certaines sont meilleures, d'autres sont plus simples, mais il n'y a jamais de solutions parfaites, le plus important c'est que ça fonctionne.

Je te propose de créer une classe de service, dont tu exposeras un singleton partagé par toutes tes sessions.
À chaque fois que tu veux faire une lecture ou une écriture (peu importe quel user c'est) tu passes par ce singleton et c'est cette classe de service qui se chargera de lire ou modifier le fichier.

Maintenant il faut jouer avec la synchronisation. Deux possibilités :
  • La plus simple : dès qu'un thread est dans une méthode (lecture ou écriture) tu fais patienter tous les autres thread qui souhaiteraient rentrer dans une autre méthode (lecture ou écriture) du service.
  • La plus souple : dès qu'un thread est dans une méthode de lecture, tu fais patienter uniquement les threads qui souhaitent faire de l'écriture. Et si ton thread est dans une méthode d'écriture tu fais patienter tous les autres thread qui souhaiteraient rentrer dans une autre méthode.

Bonnes pratiques :
  • Un thread en écriture devrait être prioritaire par rapport à un thread en lecture.
  • Chaque modification devrait être la plus petite possible (lire/modifier une case plutôt que tout le fichier)
  • Le service qui gère les données n'est pas obligé d'écrire dans le fichier à chaque fois qu'il y a une modification, il peut manipuler un cache et persister le fichier après plusieurs modifications (éventuellement ajouter une méthode flush qui forcerait l'écriture).
0