ResultSet zu Array dauert "ewig"

karl001

Grünschnabel
Hallo,

ich habe mir eine Klasse geschrieben die ein zweidimensionales Array mit einem ResultSet von einem SQL Server füllt. Dies funktioniert auch wunderbar, nur leider kann es bis zu 20 Sekunden dauern bei einem ResultSet von nur 100 Zeilen und 12 Spalten. So sieht der Code aus:

Code:
    	   //Füllen des Arrays
    	   for (int row = 0 ; row<= getRowCount()-1; row++){
 	          this.rst.absolute(row+1);
 	          
 	          for (int i = 0; i < 11; i++) {
 	        	  data[i][row] = this.rst.getObject(i+1).toString();
 	          }
    	   }
Kann es sein dass er jedemal neu auf die DB zugreift? Bitte helft mir. Ich verstehe es nicht.

MfG Acky
 
Zuletzt bearbeitet:
Was macht den die getRowCount() ? Die wird ja für jeden Durchlauf aufgerufen.

Wie bestimmst Du denn die Größe des ResultSet? Die JDBC API bietet dafür ja leider nicht keinen direkten Zugriff.

Gruß
 
Bei getObject muss der Treiber jedesmal schauen, von welchem Typ das Feld ist. Diese Wenns dann ein String ist, wird er ein String erzeugen und das wieder als Object übergeben und dieses wirst du dann als String zurückgeben.
Wenn der Typ einer Spalte schonfeststeht, müsste es mit einer eindeutigen Ansprache (als getInt oder getString() usw) schneller gehen.
Bei vielen Zeilen kann es sich auch eventuell lohnen, den Typ vorher dynamisch zu bestimmen und dann den entsprechenden getter aufzurufen.

Auch denke ich dass die Positionierung mit Next() schneller sein dürfte als mit absolute(). Insbesondere mit setFetchDirection(FETCH_FORWARD). Habs aber nicht getestet.
 
Danke für euren Antworten, aber ich habe den Fehler selbst gefunden. Bei einem ResultSet speichter er die Daten nicht lokal sondern ruft bei jeder Abfrage eines Wertes nochmal ein Select auf. Bei über 2000 Zellen in der Tabelle wird das natürlich happig. Die Lösung habe ich hier gefunden: http://www.tutego.com/blog/javainsel/2006/07/resultsets-in-bohnen-durch-rowset.html
CachedRowSet. Damit speichter er die Daten wirklich lokal und so kann ich meine Tabelle befüllen ohne ewig zu warten. Nachteil ist natürlich, dass sich die Daten dann nicht mehr aktualisieren, bis das CachedRowSet neugeladen wird, was für meine Erfordernisse aber ausreicht.
PS: Das getRowCount() funktioniert folgendermaßen:
Code:
this.rst.last(); 
      	return this.rst.getRow();

MfG Acky
 
Zuletzt bearbeitet:
Zurück