question sur la conccurence [java-servlet] - Java - Programmation
Marsh Posté le 31-07-2002 à 09:26:52
J'crois que t'as une instance de servlet par requete client !
Marsh Posté le 31-07-2002 à 09:29:34
el_gringo a écrit a écrit : J'crois que t'as une instance de servlet par requete client ! |
Marsh Posté le 31-07-2002 à 09:31:17
R3g a écrit a écrit : Prise de conscience de bon matin : si j'ai bien compris, toutes les requetes destinées à ma servlet sont traitées par la meme instance de celle-ci. Si ceci est vrai, y'a-t-il un controle de l'accès à cette servlet au niveau du container ? Pour m'expliquer, voila ce qui m'angoisse : j'ai une servlet, avec des attributs (des variables d'instance quoi), et certaines methodes dans cette servlet modifient ces attributs. Hors j viens de réaliser que c'est une très mauvaise idée, car ces attributs pourraient se trouver modifiés par le traitement d'une requête pendant le traitement d'une autre. D'où ma question : rassurez-moi, y'a-t-il un synchronized quelque part, ou est-ce que c'est à moi de le mettre ? |
C'est à toi se syncrhoniser les accès. C'est pour ca que les attributs déclarés au sein de la méthode service (ou doGet/doPost) son thread safe et pas les attributs d'instance. De plus, ton app server peut très bien faire du pooling de servlet sans te demander ton avis !!! Et créer X instances de ta servlet et distribuer la charge selon les requetes qui arrivent sur le serveur.
Conclusion: tu dois gérer la concurence et pas au sein d'une instance de la servlet mais au sein de ton servlet container (via des helpers synchronisés ou autre)
Marsh Posté le 31-07-2002 à 09:31:18
DarkLord a écrit a écrit : |
hé... calme ! j'ai dit j'crois. On a encore l'droit de se planter ?
Marsh Posté le 31-07-2002 à 09:32:12
el_gringo a écrit a écrit : J'crois que t'as une instance de servlet par requete client ! |
ah oui non ca j'en suis sur : la servlet est instanciée à la première requête qui lui est addressée, et traite toutes les suivantes ; tu vois pas le bordel si il fallait instancier un objet à chaque requête et le détruire ensuite ?
Marsh Posté le 31-07-2002 à 09:34:28
R3g a écrit a écrit : ah oui non ca j'en suis sur : la servlet est instanciée à la première requête qui lui est addressée, et traite toutes les suivantes ; tu vois pas le bordel si il fallait instancier un objet à chaque requête et le détruire ensuite ? |
C bon, Dark me l'as déja signalé. En toute délicatesse, comme il sait le faire !
Marsh Posté le 31-07-2002 à 09:35:32
DarkLord a écrit a écrit : C'est pour ca que les attributs déclarés au sein de la méthode service (ou doGet/doPost) son thread safe et pas les attributs d'instance. |
Ok donc ca veut dire que si je déclare les atributs dans la methode service et que je les passe ensuite aux autres méthodes, là j'ai pas de problème. En fait c'est l'appel à service() qui est synchronized ?
Darklord a écrit a écrit : Conclusion: tu dois gérer la concurence et pas au sein d'une instance de la servlet mais au sein de ton servlet container (via des helpers synchronisés ou autre) |
Tu peux expliquer "helpers synchronsés" stp ?
Marsh Posté le 31-07-2002 à 09:36:57
sinon si tu veux pas te casser la tete il y a une astuce
Citation : |
Marsh Posté le 31-07-2002 à 09:37:48
el_gringo a écrit a écrit : C bon, Dark me l'as déja signalé. En toute délicatesse, comme il sait le faire ! |
T'as pas besoin de faire ton frustré ou de me faire passer pour le méchant. Quand on sait pas, on se tait
Citation : |
heureusement qu'il ne te croit pas sur parole
Marsh Posté le 31-07-2002 à 09:40:45
R3g a écrit a écrit : Ok donc ca veut dire que si je déclare les atributs dans la methode service et que je les passe ensuite aux autres méthodes, là j'ai pas de problème. En fait c'est l'appel à service() qui est synchronized ? Tu peux expliquer "helpers synchronsés" stp ? |
L'appel à service n'est pas synchronisé mais chaque fois que tu vas entrer dans la méthode (meme si c'est deux threads en meme temps qui entre dans la meme méthode) les variables définies dans la méthode service (ou doGet/doPost c'est pareil) sont internes à l'appel et donc réservé à cet appel. Pas besoin de synchronisation, elles sont thread-safe de facto!
Pour le helpers, il s'agit simplement d'une classe java standard (et oui on est pas obligé que d'utiliser des servlets dans un app server ) qui synchronise ta resource. Si tu dois augmenter un compteur par exemple, ta servlet appelle un helper qui s'occupe de te donner accès si aucune autre n'instance n'est en train de bosser dessus etc ...
Si tu fais SingleThreadModel ca peut diminuer les perfs dans le cas de requete en cascade c'est à toi de voir.
Marsh Posté le 31-07-2002 à 09:42:27
DarkLord a écrit a écrit : T'as pas besoin de faire ton frustré ou de me faire passer pour le méchant. Quand on sait pas, on se tait
|
Quand on ne sais pas, on doit parler au contraire, et dire ce qu'on pense, tout en pondérant son discours d'avertissements ("je crois", "je suis pas sur", ...)
ça s'appel une hypothèse, c ça qui fait avancer le monde.
Marsh Posté le 31-07-2002 à 09:42:55
DarkLord a écrit a écrit : L'appel à service n'est pas synchronisé mais chaque fois que tu vas entrer dans la méthode (meme si c'est deux threads en meme temps qui entre dans la meme méthode) les variables définies dans la méthode service (ou doGet/doPost c'est pareil) sont internes à l'applet et donc réservé à cet appel. Pas besoin de synchronisation, elles sont thread-safe de facto! Pour le helpers, il s'agit simplement d'une classe java standard (et oui on est pas obligé que d'utiliser des servlets dans un app server ) qui synchronise ta resource. Si tu dois augmenter un compteur par exemple, ta servlet appelle un helper qui s'occupe de te donner accès si aucune autre n'instance n'est en train de bosser dessus etc ... Si tu fais SingleThreadModel ca peut diminuer les perfs dans le cas de requete en cascade c'est à toi de voir. |
Ok merci pour tout !
Effectivement je trouve SingleThreadModel un peu bourrin pour mon cas, mais c'est toujours bon à savoir.
Marsh Posté le 31-07-2002 à 09:43:06
el_gringo a écrit a écrit : Quand on ne sais pas, on doit parler au contraire, et dire ce qu'on pense, tout en pondérant son discours d'avertissements ("je crois", "je suis pas sur", ...) ça s'appel une hypothèse, c ça qui fait avancer le monde. |
T'en redemande y a l'air
Marsh Posté le 31-07-2002 à 09:48:22
DarkLord a écrit a écrit : T'en redemande y a l'air |
Et, Darklord ou non, je clamerai mes hypothèses de par le monde !!
Marsh Posté le 31-07-2002 à 09:52:05
R3g a écrit a écrit : Ah non, vous allez pas vous battre sur mon topic hein |
c'est une vieille habitude
Marsh Posté le 31-07-2002 à 09:53:55
Après chaque topic, 'faut qu'on se mette sur la gueule, on peut pas résister !
Tient Dark, prends ça dans ta gueule
Marsh Posté le 31-07-2002 à 09:25:06
Prise de conscience de bon matin : si j'ai bien compris, toutes les requetes destinées à ma servlet sont traitées par la meme instance de celle-ci.
Si ceci est vrai, y'a-t-il un controle de l'accès à cette servlet au niveau du container ?
Pour m'expliquer, voila ce qui m'angoisse : j'ai une servlet, avec des attributs (des variables d'instance quoi), et certaines methodes dans cette servlet modifient ces attributs. Hors j viens de réaliser que c'est une très mauvaise idée, car ces attributs pourraient se trouver modifiés par le traitement d'une requête pendant le traitement d'une autre.
D'où ma question : rassurez-moi, y'a-t-il un synchronized quelque part, ou est-ce que c'est à moi de le mettre ?