ValueList Handler, PagedListHolder, ... (Spring, Hibernate)

DerGrinsemann

Mitglied
Hallo!

Ich bin auf der Suche nach einer praktikablen Lösung für die seitenweise Anzeige von Datenbankinhalten.

Mein Aufbau mittels Spring 2, Spring MVC, Hibernate 3 sieht wie folgt aus:

Controller <- DTO -> Service <-> DAO <-> Domain

Bei meiner Recherche bin ich über folgende Lösungen gestolpert:

ValueList
http://valuelist.sourceforge.net/

PagedListHolder
http://static.springframework.org/s...gframework/beans/support/PagedListHolder.html

Bei beiden Lösungen stört mich das die immer die gesamte Liste abgefragt wird - bei ein paar tausend Datensätze in der Session gehalten nicht die beste Lösung.

Weiters verstehe ich auch bei beiden nicht wirklich die Schichtzuordnung - beide sind ja zwischen Controller und DTO angesiedelt. Meine Transaktionen sind im Service-Layer gekapselt - also müsste der Service-Layer der Datenlieferant sein?!

Mittels dem DAO-Pattern und Hibernate könnte ich das doch eleganter lösen! (z.B. PersonDAO.findAllPaged(page, pageSize)

Wie löst Ihr das in euren Projekten?

Meine Anforderung: Seitenweise inkl. Filter und mehrfacher Sortierung (über mehrere Spalten) - immer aktuell aus der DB.

Marco
 
Hm, die übliche Antwort: it depends... Der Servicelayer ist auf Grund der Clientorientierung auch ein guter Platz für Caching. Daher zielen viele Lösungen eben auf diesen Layer.

Die Frage ist, ob du caching willst/brauchst oder nicht. Entweder gehst du jedes Mal auf die DB und trägst einfach die anzuzeigende Seite, Anzahl der Anzuzeigenden Elemente pro Seite nach unten durch, oder du cacht halt die komplette Liste im Servicelayer und gibst einfach nur einen teil davon pro Anfrage zurück (auch bekannt als ValueListHandlerPattern - Core J2EE Patterns - . Erster Ansatz hat die DB als Flaschenhals, der zweite den Speicher.

Ein paar Sachen versteh ich noch nicht ganz. Warum sollten die Daten komplett in der Session gehalten werden? Von deinem Service gibt es 1 Instanz pro Anwendung, d.h. die Daten hast du einmal. In der Session brauchst du eigentlich gar nix... (der PageListHolder tut das zwar, aber der ist meiner Meinung nach keine sinnvolle Lösung).

Desweiteren find ich deinen DTO "Layer" etwas komisch. Oder willst du damit ausdrücken, dass der Controller vom Service nur DTOs bekommt? Das würde eher Sinn machen... allerdings müsste dann Domain auch zwischen Service und DAO... ;)

Gruß
Ollie
 
Hallo!

Desweiteren find ich deinen DTO "Layer" etwas komisch. Oder willst du damit ausdrücken, dass der Controller vom Service nur DTOs bekommt? Das würde eher Sinn machen... allerdings müsste dann Domain auch zwischen Service und DAO... ;)

Natürlich hast du recht! Richtig ist:

Controller <- DTO -> Service <-> Domain <-> DAO

Der Service-Layer gibt nur DTO's zurück und der DAO-Layer nur Domain-Objekte.

Um auf das Pattern "ValueListHandler" noch einmal aufzugreifen. Er liegt also eine Schicht vorm Service-Layer? Und wird vom Controller direkt aufgerufen?

Weiters muss ich bei diesem Pattern doch auch wieder alle DS abrufen!?

Verdammt, ich steh heute wirklich am Schlauch :confused:
Marco
 
Zuletzt bearbeitet:
Wo bzw. wie du den VLH implementierst ist Geschmacksfrage... eigentlich sollte es klar sein: dein Service macht eine Datenbankabfrage - zwei Möglichkeiten:

1. Komplette Liste lesen und anzuzeigende Teilliste selbst rauslesen.
Hier macht caching auf jeden Fall Sinn. Die komplette Liste liegt einmal im Speicher und du gibst immer nur die Teilliste an den Client (Controller) zurück. Bei Schreiboperationenen wird der Cache invalidiert.

2. Nur die konkrete Teilliste lesen und zurückgeben
Sorgt auch für einen Datenbankzugriff pro Anfrage. Hier könnte man auch überlegen, ob man nicht nach und nach einen Cache füllt und nur ungecachte Seiten nachlädt.

Das ganze machst du entweder direkt im Servicelayer. Caching bietet sich da an, oder im Bereich des DAOs das ist Geschmacksfrage. Wenn du Hibernate einsetzt, kann man evtl auch den Secondlevelcache davon nutzen... Ehcache z.B.

Gruß
Ollie
 

Neue Beiträge

Zurück