Java StackOverflowError bei Rekursion

kellerlanplayer

www.Blog2Help.com
ID: 10624
L
29 April 2006
2.280
247
Hi Leute,

wie schon der Titel verlautbaren lässt, habe ich bei einer Rekursion einen java.lang.StackOverflowError.

Es ist zwar keine Endlosschleife, aber die Funktion holt quasi immer 5 Einträge aus einer Datenbank, simuliert bisschen herum und holt dann die nächsten fünf Einträge via Rekursion. Hier mal ein Pseudocode:

Code:
public static void scoreSimulationStarten (Integer id) throws Exception
{
  ResultSet daten = SELECT * From Tabelle Where primärschlüssel > id;

  for (Objekt o : daten)
  {
      //berechne irgendwas
   }

  if(daten !== null)
  {
      id = id + 5;     
      scoreSimulationStarten (Integer id)
  }
}

Wie kann ich denn so eine "Endlosberechnung" umsetzen, ohne dass es mir den Speicher vollhaut? Jemand Tipps?
Mehr Arbeitsspeicher zuweisen hab ich schon gemacht.

Vielen Dank schon mal für eure Hilfe :)
 
Frage: Brauchst du denn immer alle Einträge bzw. das Ergebnis der Berechnung oder reichen dir immer die aktuellen 5 aus???

Und eine Anmerkung: In dem Pseudocode unten bekommst du die gleichen Einträge immer mehrfach (ich nehme id's hochlaufend an, du holst id > 1 und bekommst alle bis 100, dann holst du id > 6 und bekommst wieder 94 die du schon vorher hattest. Ist das so gewollt? Wenn ja, warum dann ein Rekursion?
 
Wofür denn überhaupt Rekursion an dieser Stelle? Machst du nach dem Ausschnitt noch irgendetwas anderes mit dem Recordset? Wenn wir von den von Paladin angenommenen 100 Datensätzen ausgehen, produzierst du daraus 20 Recordsets, die gleichzeitig im Speicher liegen. Warum? Wenn du immer nur mit fünf Datensätzen "ein bisschen herumsimulieren" möchtest, tut es dann nicht auch eine einfache Schleife?
Code:
for(id=0; id < max; id+=5) {
  ResultSet daten = SELECT * From Tabelle Where primärschlüssel > id and primärschlüssel <= id + 5;

  for (Objekt o : daten)
  {
      //berechne irgendwas
   }
}
 
Danke wie immer für eure Hilfen :)

@marac und Paladin
Frage: Brauchst du denn immer alle Einträge bzw. das Ergebnis der Berechnung oder reichen dir immer die aktuellen 5 aus???

Und eine Anmerkung: In dem Pseudocode unten bekommst du die gleichen Einträge immer mehrfach (ich nehme id's hochlaufend an, du holst id > 1 und bekommst alle bis 100, dann holst du id > 6 und bekommst wieder 94 die du schon vorher hattest. Ist das so gewollt? Wenn ja, warum dann ein Rekursion?

Da fortlaufend Daten hinzukommen können, ist es schon gut, dass immer mal wieder eine neue Abfrage angestoßen ist. Außerdem ist es aus der Idee entstanden "Speicher zu schonen", was jetzt mit 64 GB Arbeitsspeicher natürlich egal ist.

Ich habs wohl gelöst. Anscheinend ist der Fehler daher gekommen, weil ich das Resultset nicht geschlossen habe ...