Announcement

Collapse
No announcement yet.

Application Scope - Postconstruct in Zeitabständen neu laden

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

  • Application Scope - Postconstruct in Zeitabständen neu laden

    Guten Tag,

    gibt es die Möglichkeit im ApplicationScoped den Postconstruct in gewissen Zeitabständen (z.B. übern TimerService) neu zu initialisieren?

    Vielleicht habt ihr auch eine andere/bessere Lösung zu meinem Problem:

    Ich habe auf der Startseite einige Videos die ich aus meiner DB auslese. Diese will ich nicht bei jedem Clientaufruf neu initialisieren, sondern nur in gewissen Zeitabständen (eine Art Caching).

    Schonmal danke für eure Hilfe im vorraus.

  • #2
    Nach erstem Request im ApplicationScope speichern

    Hallo Tream84,

    Ich würd eine Map definieren, die die Videos mit ihrem Namen mappt. Diese Map würd ich in den ApplicationScope packen. Wenn ein User ein Video aufruft, schaust Du mit dem Namen in der Map nach, ob es das schon gibt, falls nicht, wird es aus der Datenbank geladen, in der Map gespeichert und dann ausgegeben.

    So würd ichs machen, wenn die Videos unbedingt im ApplicationScope landen sollen. Ansonsten ist es eher eine schlechte Idee, zuviele Objekte in die Scopes zu packen. Darunter leidet die Clusterfähigkeit der Anwendung.

    Gruß ngomo.
    http://www.winfonet.eu

    Comment


    • #3
      Hallo ngomo,

      dein Lösungsvorschlag hört sich gut an.

      Könntes du mir das leiden der Clusterfähigkeit etwas genauer schildern?

      Ich dachte da zu jedem Video der Uploader + das Datum etc. angezeigt werden muss, ich gleich das gesamte Objekt (Entity) im Scope festhalten muss.
      Ist das nicht der Sinn der Objektorientierten Programmierung?

      Comment


      • #4
        Synchronisation

        Hallo Tream84,

        Könntes du mir das leiden der Clusterfähigkeit etwas genauer schildern?
        In einem Cluster müssen die längerlebigen Contexte (also Application und Session) über alle Knoten des Clusters synchroniziert werden, damit der Nutzer von einem Knotenwechsel nichts mitbekommt. Denn, wenn der Knoten, mit dem der Benutzer gerade verbunden ist, ausfällt und ein anderer übernimmt, müssen dort die gleichen Daten verfügbar sein. Je mehr Daten Du in diese Scopes packst, desto schwieriger wird die Synchronisation
        Ich dachte da zu jedem Video der Uploader + das Datum etc. angezeigt werden muss, ich gleich das gesamte Objekt (Entity) im Scope festhalten muss. Ist das nicht der Sinn der Objektorientierten Programmierung?
        Das würde ich trennen. Ich würd eine Klasse UploadInfo definieren, die die ganzen Daten enthält, die Du genannt hast, plus ein Feld für die Id des zugehörigen Videos. Instanzen von UploadInfo würden recht wenig Speicher verbrauchen, da sie nur die paar Datenfelder enthalten. Diese Klasse mappst du auf eine Tabelle in der Datenbank. In einer zweiten Tabelle hast Du die Videos als Blobs mit der Id als primary key.

        Wenn ein Nutzer Deine Videoseite aufruft, holst Du alle UploadInfos (evt. gefiltert nach Datum oder sowas) aus der Datenbank und kannst damit alle benötigten Infos auf der Seite anzeigen. Das würde ich bei jedem Aufruf der Seite machen, also nichts im Session- oder der Applicationscope speichern.

        Wenn ein Nutzer dann den Link zum Video anklickt, holst Du Dir nicht etwa erst das Blob als Objekt und gibtst es dann erst weiter, sondern Du streamst es direkt. Wobei ich zugeben muss, dass ich das selbst noch nie gemacht hab. Da muss ich Dich auf google und die Suchbegriffe "jdbc stream blobs" oder "hibernate stream blobs" verweisen.

        Gruß ngomo
        Zuletzt editiert von ngomo; 11.09.2010, 19:39.
        http://www.winfonet.eu

        Comment


        • #5
          Originally posted by ngomo View Post
          Hallo Tream84,
          Wenn ein Nutzer dann den Link zum Video anklickt, holst Du Dir nicht etwa erst das Blob als Objekt und gibtst es dann erst weiter, sondern Du streamst es direkt.
          Gruß ngomo
          Danke für die ausführliche Info.
          Ich habe leider vergessen zu erwähnen, dass ich keine direkten Videos habe sondern nur Video aus YouTube verlinke.
          D.h. ich speichere im prinzip nur die YouTube Video Ids in meine Datenbank.

          Comment


          • #6
            Embed Button auf youtube

            Hallo Tream84,

            das ist ja noch einfacher. Dann fällt das Streaming von Blobs weg. Youtube bietet auf seinen Seiten unter dem jeweiligen Video einen "Einbetten-Button" an. Wenn man den klickt, geht ein Textfeld auf, in dem HTML-Code drinnen steht, mit dem man das jeweilige Video in seine Seite einbauen kann. Der Code sieht wie folgt aus:

            Code:
            <object width="640" height="385">
              <param name="movie" value="http://www.youtube.com/v/Xoa3w_hDuCE?fs=1&amp;hl=de_DE">
              </param>
              <param name="allowFullScreen" value="true">
              </param>
              <param name="allowscriptaccess" value="always">
              </param>
              <embed src="http://www.youtube.com/v/Xoa3w_hDuCE?fs=1&amp;hl=de_DE"
                type="application/x-shockwave-flash" allowscriptaccess="always"
                allowfullscreen="true" width="640" height="385">
              </embed>
            </object>
            Die Stellen mit der Video-ID habe ich fett gemacht. Die müsstest Du dynamisch mit den Werten aus deinem UploadInfo-Objekt füllen. Du musst wahrscheinlich etwas rumtüfteln, bis es läuft.

            Gruß ngomo
            http://www.winfonet.eu

            Comment


            • #7
              Hi gnomo,
              genau so hab ichs auch bei mir drin. Mir gings nur dadrum festzustellen, ob der Applicationscope performanter als der Request- , view oder Sessionscope ist.
              Ich finde leider keine gescheiten Infos dazu.
              Was genau geschieht im Hintergrund? Wird die Klasse serverseitig gecached? Wieviel Speicher verbraucht es?

              Comment


              • #8
                Gleich

                Hallo Tream84,

                Mir gings nur dadrum festzustellen, ob der Applicationscope performanter als der Request- , view oder Sessionscope ist.
                Das hängt natürlich von dem Webcontainer (Tomcat, Jetty...) ab. Ich würde aber mal behaupten, dass es hinsichtlich der Zugriffsgeschwindigkeit (speichern, rausholen) keinen messbaren Unterschied macht, ob Du ein Object im ApplicationScope, SessionScope etc. ablegst.

                Wenn ich Dich richtig verstanden habe, störst Du Dich daran, dass für jeden Aufruf der Videoseite eine neue Abfrage an die Datenbank gemacht wird. Du willst die Abfrageergebnisse deswegen irgendwie cachen. Da sage ich: "Mach es trotzdem." Erstens, der Nutzer wird sicher keinen Unterschied merken. Und zweitens, die Datenbank ist der einzige Ort, wo wirklich alle aktuellen und gültigen Daten vorliegen. Wenn du Abfrageergebnisse im ApplicationScope cachest und in der Zwischenzeit neue Einträge in der Datenbank gemacht wurden, zeigst du immer einen veralteten Stand an. Das war sicherlich der Grund für Deine Ausgangsfrage (in Zeitabstänen neu laden).

                Wenn Du schon unbedingt cachen willst, um die Datenbankabfragen zu minimieren, dann lass das Dein Mappingframework (z.B. Hibernate) machen. Das erfüllt alle Anforderungen. Du zeigst immer den aktuellen Datenbestand an, Du minimierst Datenbankabfragen, Du überfrachtest keine Scopes mit gecachten Daten und das Beste: Du hast einen bereits fertigen Cachingmechanismus, der tausendfach getestet wurde. Von dem Du also ausgehen kannst, dass er funktioniert.

                Investier Deine wertvolle Zeit lieber in noch mehr Features oder eine schönere Darstellung Deiner Seite. Ach ja, und wenn Du fertig bist, poste mal einen Link.

                Gruß ngomo
                http://www.winfonet.eu

                Comment


                • #9
                  ngomo du bist echt Top. =)

                  Mit dir zu schreiben macht echt spaß.

                  Wenn Du schon unbedingt cachen willst, um die Datenbankabfragen zu minimieren, dann lass das Dein Mappingframework (z.B. Hibernate) machen.
                  Also ich nutze Glassfish V3 und EclipseLink. Meinste Caching wie z.B. durch NamedQueries oder das nutzen der find() Methode?
                  Kannst du mir irgendeine Seite oder Buch empfehlen, welches genauere Infos darüber gibt?

                  Die meisten sind einfach zu Oberflächlich.

                  Comment


                  • #10
                    Nein die Abfrageergebnisse

                    Hallo Tream84,
                    Meinste Caching wie z.B. durch NamedQueries oder das nutzen der find() Methode?
                    Nein, ich meinte im engeren Sinne das Caching der Abfrageergebnisse und im weiteren Sinne die anderen Optimierungen, die ein Mapping Framework sonst noch so macht, um Abfragen an die Datenbank zu vermeiden/reduzieren.

                    Kannst du mir irgendeine Seite oder Buch empfehlen, welches genauere Infos darüber gibt?
                    Bei Hibernate hab ich mir die Doku als pdf besorgt (http://docs.jboss.org/hibernate/stab..._reference.pdf) und durchgelesen. Das hat für mich gereicht. Ansonsten ist das folgende Buch wohl mehr oder weniger das Standardwerk zu Hibernate: http://www.amazon.de/Java-Persistenc...4388149&sr=1-1

                    Aber ich schweife ab. Du hast mich ja nach EclipseLink gefragt. Da muss ich leider passen.

                    Ansonsten lies Dir ruhig mal folgenden kurzen Artikel zum Caching in Hibernate durch: http://www.ordix.de/ORDIXNews/3_2006...hibernate.html Da ist auch erklärt, was ein Cache konzeptionell macht und was man bei der Benutzung beachten musss. Lohnt sich also auch, wenn man Hibernate selbst nicht verwenden will.

                    Gruß ngomo
                    http://www.winfonet.eu

                    Comment


                    • #11
                      Hi ngomo,

                      du wolltes ja noch das Projekt sehen. Es ist nun online.

                      www.covgo.com

                      Have fun =)

                      Comment


                      • #12
                        Cool

                        Ja cool die Seite sieht richtig schick aus. Wenn ich mal einen Karaokeabend von mir aufgenommen hab lad ich den auch hoch, versprochen. Meine Roland Kaiser Nummer ist legendär. Grüße in die Opelstadt.
                        http://www.winfonet.eu

                        Comment

                        Working...
                        X