Announcement

Collapse
No announcement yet.

Multithreading in Servlets

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Multithreading in Servlets

    Ich hätte wieder einmal eine Fragen, zu deren Beantwortung ich schon viel gelesen habe, aber leider nichts zur endgültigen Weisheit gelangt bin.
    ich versuche derzeit mein Servlet (und die dahinterhängenden EJB`s ) zu testen, in dem ich an meinem Client mehrere Threads erzeuge und diese auf das Servlet losjage.
    Meines Wissen erzeugt z.B. der Jserv als auch der BenaTA mehrere Threads zum Aufruf des Servlets.
    Das bedeutet doch für mich, dass ich meine Klasse "threadsicher" machen muss.
    Dies geschieht doch im allgemeinen doch das Schlüsselwort "synchronized".
    Zuerst dachte ich dieses Schlüsselwort nur denjenigen Methoden voranstellen zu müssen, die schreibenden Zugriff auf externe Datenquellen besitzen.
    Je mehr ich mich aber schlau mache, desto unsicherer werde ich mir dabei;
    Im letzten Java-Spektrum steht z.B. folgender Satz:
    "Immer wenn die Erzeugung von Instanzen in einem nebenläufigen Kontext (sprich nicht im Konstruktor) erfolgt, ist es nötig, die Synchronisation sicherzustellen. Nur wenn die Instanzierung beim Laden der Klasse ausgeführt wird, sorg der ClassLoader für die Synchronisation."
    Oder in einem anderen buch
    "Sobald eine Methode den Zustand eines Objektes verändert, ist diese zu synchronisieren"

    Heißt da jetzt für mich das ich eigentliche jede Erzeugung einer Klasse und fast jeden Methodenaufruf synchronisieren muss ??
    Kann doch nicht sein...

    Ich hoffe Sie können mir hier weiterhelfen.

  • #2
    Schau mal in das Buch Concurrent Programming in Java(TM): Design Principles and Pattern von Doug Lea. Dann bleiben keine Fragen mehr offen. Sehr praxisnah geschrieben. Außerdem solltest Du dann verstehen, wie in einem Servlet gesperrt wird. Generelle Regel: pro Request sollte von der Engine ein eigener Thread verwendet werden, alle lokalen Variablen nicht sperren, shared-Sachen (Servlet-Attribute, Dinge die per context.getAttribute kommen) gehören auch dazu

    Comment


    • #3
      danke für Deine Antwort;
      aber was meinst Du mit sperren ??
      verstehe ich das schon richtig, wenn mehrere Threas parallel laufen können diese zwar z.B. auf static Variablene gemeinsam zugreifen; bei der Erzeugung von Instanzen einer Klasse können Sie sich aber nicht in die Quere kommen (zumindesten in einem Servlet);
      lokale Variabeln müssen also nicht durch einen extra "synchronized" bereich geschützt werden

      Comment


      • #4
        Hi,

        > lokale Variabeln müssen also nicht durch einen extra "synchronized"
        bereich geschützt

        Sag ich doch:

        > alle lokalen Variablen nicht sperren

        ;

        Comment


        • #5
          Danke für Deine Geduld Thomas,
          aber noch eine kleine Frage;
          was muss denn dann synchronized werden, außer Methoden,die z.B. einen schreibenden Zugriff auf einen Datenträger haben ??

          schönen Sonntag noch wünscht
          jo

          Comment


          • #6
            Danke für Deine Geduld Thomas,
            nur noch eine Frage, was muss dann überhaupt noch mit synchronized versehen werden, ausser Methoden, die z.B.einen schreibenden Zugriff auf einen Datenträger haben;

            schönen Sonntag noch
            wünscht jo

            Comment


            • #7
              Solltest Du nur eine JDBC-Connection nutzen, sync. alles vom Anfang der Transaktion bis zum commit/rollback. Ansonsten nutze eine JDBC-Pool (da gibt es auch freie Implementierungen).

              Genauso: Nutzt Du eine Socket-Connection und die wird nicht in doGet() auf- und wieder abgebaut, sondern als privates Attribut. des Servlet gehalten, mußt Du sync.

              Mach nich so lange, es ist Sonntag ;

              Comment


              • #8
                hab am Sonntag auch nicht solange, ausser Dir ne Antwort geschrieben;
                aber jetzt sitzt ich wieder in der Arbeit :-(
                hab jetzt nochmal genauer nachgeschaut; mein Servlet benutzt derzeit die doPost methode; an dieser Stelle warte ich eben auf den Aufruf der "Servletengine", was die im Hintergrund so macht, da hab ich leider keine Ahnung, da ich hierfür nicht zuständig bin;
                aus diesem Grund weiss ich auch nicht über eine JDBC-Connection;

                Mein Servlet wertet einfach den übergebenen Request (eigentlich ein xmlString) und ruft anschließend entsprechende EJB`s in einem Applikationsserver auf (das aber nur am Rande)

                wie siehts den bei doPost mit dem sync. aus ????
                bzw. was ist überhaupt der Unterschied zw. dopost und doget ??

                wünscht Dir einen schönen Arbeitstag
                Joe

                Wüns

                Comment


                • #9
                  http://test<br>
                  <br>
                  ist get<br>
                  <br>
                  in einer HTML-Seite
                  form action="http://test" method="get"<br>
                  ...<br>
                  /form<br>
                  <br>
                  ist get
                  <br>
                  form action="http://test" method="post"<br>
                  ...<br>
                  /form<br>
                  <br>
                  ist post.

                  Bei get darfst Du nur eine bestimmte Anzahl von Parametern mitposten (1024 Zeichen), die in die URL encoded werden (http://test?parm=value&parm1=value1). Post kennt diese Beschränkung nicht.

                  Btw.: Mach Dir mal um die Beans keine Sorgen. Da brauchst Du nix sync., die sind in der Regel nicht reentrant

                  Comment


                  • #10
                    danke für Deine vielen Antworten;
                    vielleicht liest man sich ja mal wieder;
                    wegen den beans mach ich mir eh keine Sorgen, denn diese werden bei mehreren Aufrufen immer von einem eigenen Prozess gestartet;

                    problematisch ist da halt eher die Sache mit dem Servlet;
                    nachdem ich aber sichergestellt haben, dass weder gleichzeit auf Dateien bzw. DB schreibend zugegriffen wird, und auch keine statischen Variablen gleichzeitig verwendet werden, hoffe ich mal auf Gott und lehne mich zurück;
                    gehe einfach mal davon aus, dass wenn innerhalb eines Servlets Instanzvaribalen erzeugt und verändet werden es keine Seiteneffekt haben kann, da dies ja schließlich in eigenen Instanzen abläuft, oder ? :-

                    Comment

                    Working...
                    X