Maison  >  Questions et réponses  >  le corps du texte

Tomcat - problème de stockage de données Java

Comme le titre l'indique, il existe un système de connexion, mais l'ancien projet n'a pas de cache (je n'ai pas le droit de l'ajouter), mais différents services doivent utiliser les données des requêtes http précédentes (distinguées par l'utilisateur) , et je souhaite le sauvegarder pour éviter d'envoyer des requêtes http à plusieurs reprises à chaque fois.

Springmvc back-end

Actuellement, je peux penser à 3 méthodes :

1. Jetez-le dans la session (HttpSessionListener), cela devrait être le plus simple, mais je ne connais pas les problèmes potentiels
2. Jetez-le dans le threadlocal (le contrôleur crée une variable threadlocal statique ou écrit un contexteholder)
3. . Le contrôleur devient membre de ConcurrentHashMap, insérez les données en fonction de <ID utilisateur, données obtenues par requête http> Mais cela n'est certainement pas réalisable et peut provoquer une zone de tas OOF

.

Parlons des problèmes possibles avec la deuxième option.
1. Il existe un possible problème de fuite de mémoire mentionné sur Internet, qui provoque une OOF dans PermGen. Le texte original est connecté à l'analyse du cas de fuite de mémoire ThreadLocal.

Je ne sais pas s'il y aura un problème (le texte original n'est pas clair), car l'ensemble de ThreadLocalMap dispose d'un mécanisme de protection

2. La chaîne de données dans le fil de requête apparaîtra-t-elle ? Par exemple, un fil de requête répond aux requêtes de deux utilisateurs (A et B) en même temps. fil de demande Lors du service A, j'ai reçu les données de B. .

迷茫迷茫2686 Il y a quelques jours659

répondre à tous(1)je répondrai

  • 给我你的怀抱

    给我你的怀抱2017-06-12 09:23:38

    La méthode 1 est la plus simple et la plus couramment utilisée. Si le nombre d'utilisateurs est trop important ou si un équilibrage de charge est effectué, il est nécessaire de mettre en œuvre un stockage centralisé de la session. Il existe de nombreuses solutions prêtes à l'emploi qui peuvent prendre en charge le stockage centralisé de HttpSession. , y compris Redis, MongoDB et MySQL. Il y en a tous, recherchez sur GitHub.

    La méthode 2 ne résout pas le problème, principalement parce qu'une fois l'utilisateur connecté, plusieurs requêtes peuvent tomber dans plusieurs threads. Le deuxième point que vous évoquez est aussi une raison.

    La méthode 3 est également une méthode d'implémentation. En fait, HttpSession de Tomcat est implémentée à l'aide de ConcurrentHashMap (seulement elle utilise sessionId au lieu de userId comme clé), mais une chose à noter est que vous devez gérer vous-même chaque valeur-clé dans la carte. Cycle de vie, par exemple, si la session expire, elle doit être supprimée à temps.

    répondre
    0
  • Annulerrépondre