Thread sicherheit bei Servlets?!

Looky

Erfahrenes Mitglied
Hallo zusammen,

ich habe einen Tomcat und ein Servlet zur Kommunikation mit meiner Datenbank. (Postgres) Ich benutze Connection Pooling. Nun habe ich ein Multi-User System mit zum Teil mehr als 100 benutzern gleichzeitig.

Was passiert wenn 3 oder mehr Benutzer gleichzeitig das Servlet ansprechen, welches sich ja immer einen Conneciton aus dem Pool nimmt und 3 verschiedene Abfragen mache.

Läuft jeder Call an ein Servlet "in einem eigenen Thread" oder kann ein Call den anderen behinidern?

Lg
Looky
 
Servlets sollten threadsafe programmiert werden. D.h. es ist potentiell möglich, dass ein Servlet von mehreren Threads benutzt wird.

Gruß
Ollie
 
ja ok, aber wie sage ich dann dem einen client, dass er bitte warten soll bis der andere client fertig ist? Hast du eventuell ein Codebeispiel?
 
lol, ich glaube wir verstehen uns nicht.

Also, ich habe wie oben beschrieben mehrere Clients die auf eine DB zugreifen. was ich nun einfach vermeiden will ist das der eine Client mit seiner abfrage den anderen Client mit seiner anderen Abfrage stört.

Und dafür bräuchte ich ein kleines Beispiel, wie man da Präventiv Maßnahmen ergreifen kann, weil es ja offensichtlich ein Problem gibt, wenn ich einfach in der doGet Methode eine Connection aus dem Pool hole, eine abfrage mache und diese dann wieder zurückschmeiße.

Chriz
 
Tut es ja eben nicht, solang du die nicht als Instanzvariable im Servlet ablegst. Wenn du die Connection in der doGet() holst, sauber wieder zu machst usw., ist das kein Problem. Bist du dir sicher, dass du verstanden hast, was Threadsafety genau ausmacht? Es gibt - ein threadsafes Servlet vorrausgesetzt - keinen Grund den Client zu limitieren. In den meisten Fällen ist halt einfach die Anzahl der zur Verfügung stehenden Connections dann der Flaschenhals, d.h. der ConnectionLookup dauert halt evtl. so lang bis ein anderer Client seine wieder freigibt.

Gruß
Ollie
 
naja, ich habe für ca 100 benutzer geschätze 300 Connections die genutzt werden können.

wie könnte ich diese Problematik denn am besten unter den gegebenen Umständen lösen?

Chriz
 
Ehrlich gesagt, seh ich noch immer das Problem nicht. Im Normalfall brauchst du pro Client nicht mal genau 1 Connection, weil sicher nicht alle Clients gleichzeitig anfragen. D.h. der 45. Client bekommt evtl schon wieder die 1. Connection, nachdem der 1. Client fertig wurde.

Nochmal ;) Wo ist das Problem? :D Vermutest du nur eins oder hast du eins? Schreib dir dich einfach mal nen Servlet, dass z.B. aus Commons DBCP ne Connection holt, irgend nen einfachen Query abschickt und die wieder zu macht. Dazu mit HttpClient nen Client, der in mehreren Threads eben viele Verbindungen zum Servlet aufmacht... Wenns dann hakt, postest du halt den Code und wir schauen drüber.

Was passiert haben wir ja nun schon diskutiert, wo allerdings ein Problem sein soll, seh ich (noch) nicht ;).

REINHAUN!
 
Hallo

ich habe das o.g. Szenario schon ausprogrammiert. Bisher hat das keine Probleme gemacht, aber falls das in Zuzkunft Probleme machen sollte, dann wollte ich lieber Präventivmaßnahmen ergreifen und lieber zu beginn mein Konstrukt umbauen.

Also so wie ich das beschrieben habe ist es der "normale" Weg für eine Ajax Applikation, die eine DB abfrage machen will ja? Ich bau mir da nicht irgendwie ein komisches Konstrukt auf und brauche auch, vorrausgesetzt ich mache das so wie oben beschrioeben keine Probleme erwarten, richtig?

Christian
 
ich habe das o.g. Szenario schon ausprogrammiert. Bisher hat das keine Probleme gemacht, aber falls das in Zukunft Probleme machen sollte, dann wollte ich lieber Präventivmaßnahmen ergreifen und lieber zu beginn mein Konstrukt umbauen.
Premature optimization is root of all evil. Besonders wenn man im Trüben fischt.

Also so wie ich das beschrieben habe ist es der "normale" Weg für eine Ajax Applikation, die eine DB abfrage machen will ja? Ich bau mir da nicht irgendwie ein komisches Konstrukt auf und brauche auch, vorrausgesetzt ich mache das so wie oben beschrioeben keine Probleme erwarten, richtig?

Das kann ich nicht ausschließen. Was weiß ich denn, was für Code du schreibst. ;) Was ich aber gern sagen kann, ist dass die Vorgehensweise durchaus üblich ist, HTTP sehr gut skaliert (man munkelt, das WWW basiert darauf) und du deinem Servletcontainer einfach ein wenig mehr Vertrauen schenken solltest ;). Happy Coding!

REINHAUN!
 

Neue Beiträge

Zurück