# Struts Performance-Schwäche



## 7bkahnt (14. Jun 2010)

Hallo Leute,
ich habe folgendes Problem.
Ich lasse mittels Struts und Hibernate eine Tabelle anzeigen.
Diese hat 12.000 Datensätze. Ich lasse die Datensätze mittels Hibernate in eine Liste schreiben und werte diese dann mithilfe eines Iterators aus:

Hibernate:

```
List<Adr> dsliste = null;
dsliste = session.createQuery(statement).setInteger(0, f_id_lfd_struktur).list();
```


Struts-Aufruf:

```
<div class="content">
	<table  class="userTable" cellpadding="5px">	
			<s:iterator value="dsList" status="adrStatus">
			<tr onclick="doIt(event)" class="<s:if test="#adrStatus.odd == true ">odd</s:if><s:else>even</s:else>">
				<td><s:property value="name" />
				</td>
				<td><s:url id="editURL" action="auswahlname">
					<s:param name="idds" value="%{id_adr_adresse}"></s:param>
					<s:param name="idauswahl" value="%{#adrStatus.index}"></s:param>
					</s:url> 
					<s:a href="%{editURL}" >Auswahl</s:a></td>
			</tr>
		</s:iterator>
		</table>
```

Dieser Vorgang dauert jedoch recht lange, da mittels dem Iterator ersteinmal 12.000 <tr>´s erstellt werden müssen.
Gibt es da noch eine andere Möglichkeit, dies zu realisieren?

Oder gibt es eine Möglichkeit, zwei body´s zu erstellen und nur einen dann immer zu aktualisieren?
Weil es noch ein weiteres Performace-Problem bei mir gibt.
Ich kann nach Anzeige aller Daten dann einen Datensatz auswählen, mittels des "Auswählen"-Button. Dann wird der ausgewählte DS in unten stehende Textfelder geschrieben und verlinke zurück dann erneut auf die jsp, damit es in die Textfelder geschrieben wird.
Und genau da liegt mein Problem. Es wird also ein weiteres mal der Iterator verwendet und wieder 12.000 tr´s erzeugt. Gibt es da eine Lösung nur die Textfelder unten zu aktualisieren und den oberen Teil (die Tabelle) nicht?

Ich wäre echt dankbar für wenigstens eine Lösung bzgl. meines Problems^^

Danke schonmal mi voraus.


----------



## gman (14. Jun 2010)

Hi,

die Lösung für das erste Problem findest du bestimmt unter dem Stichwort "Pagination". Für
das zweite Problem bietet sich ja eigentlich AJAX an. Bei ersterem kann ich dir wohl weiter
helfen. Hier ein paar kurze Tipps:

- Man kann ja bei einer SQL-Abfrage die Anzahl der zurückgegebenen Tupel einschränken
- Man kann sich auch die Ergebnisse ab einem bestimmten Index zurückgeben lassen
- Mit beidem zusammen kannst du dann seitenweise durch deine 12.000 Ergebnisse gehen

Ich hoffe das hilft dir weiter.


----------



## 7bkahnt (14. Jun 2010)

Ja stimmt. Das ist eine gute Idee, die Seiten zu begrenzen.
Danke dir. Dadurch dürfte dann ja ebenfalls das zweite Problem erledigt sein, dass ich beim Auswählen alle Datensätze nochmals lade.(bei 20-30 Stück ist das ja kein Problem)

Weißt du zufällig, wie ich die Seitenzahlen dynamisch gestalten kann?
Ich hatte bisher immer nur statische Sachen gefunden, mit Seitenzahlen von 1-10 o.ä. .
Bei 12.000 Datensätzen könnte dies aber etwas schwer werden


----------



## gman (14. Jun 2010)

Naja, du zählst erstmal wieviele Datensätze du zurück bekommst und teilst die Zahl
durch die Anzahl der Datensätze die du auf einer Seite anzeigen willst und hast
damit die Anzahl der Seiten. Mit der Zahl kannst du dann die benötigten Links
generieren die einer Action die Seitenzahl übergeben und welche dann die Datensätze
zu der Seite zurückliefert.


----------



## maki (15. Jun 2010)

Ein Suchbegriff dazu wäre zB. "Paging"


----------



## 7bkahnt (24. Jun 2010)

Ideal. Danke euch für euere Hilfe!


----------

