SQL-Statement Auslesen des Resultset wird immer langsamer

nahum77

Mitglied
Hallo zusammen

Ich habe ein seltsames Phänomen:

Wenn ich ein Resultset mit vielen Records (80'000) auslese und daraus Objekte erzeuge geht das zuerst sehr fix wird aber immer langsamer bis schliesslich nur noch 1 Record pro Sekunde verarbeitet wird.

Woran liegt das?

Ich rufe das .jar aus der Konsole auf und habe da auch schon mehr Speicher zugewiesen
Code:
java -Xmx256m -jar
Aber das half auch nix.

Speicher Auslastung und CPU sind im grünen Bereich und veränderen sich während des Programmlaufes auch nicht.

Die Records sind nicht gross und alle Werte in der selben View vorhanden. Das laden des Resultset dauert dann auch weniger als 1 Sekunde. Das verarbeiten der Record macht mir Probleme.

Hat hier jemand eine gute Idee?

Danke und Gruss
Nahum77
 

nahum77

Mitglied
Hier mal mein Code

Ist schon etwas aufwendig, liegt vor allem daran, dass die Sache möglichst dynamisch bleibt.

Die checks die jeder Wert (abhängig von seinem Typ durchläuft beinhaltet ledigilich eine if(RS.wasNull) Abfrage und wenn ja dann wird dies geloggt und ein Defaultwert zurückgegeben.

Java:
 private void checkRecords() {

    mStatus = NOTOK;
    if (mPrintINFO) {
      System.out.println(mSdf.format(new java.util.Date()) + CHECKSTRAT + mTablesAndColumnsString[0]);
    }//end if
    DataRecord drc = null;
    String collumn3 = mTablesAndColumnsString[3].substring(0, mTablesAndColumnsString[3].indexOf(";"));
    String collumn4 = mTablesAndColumnsString[4].substring(0, mTablesAndColumnsString[4].indexOf(";"));

    try {
      while (mRs.next()) {

        int countrow = 7;
        drc = new DataRecord(checkString(mChangeID, 1, mRs.getString(1)),
                checkString(mChangeID, 2, mRs.getString(2)),
                checkTimestamp(mChangeID, collumn3, mRs.getTimestamp(3)),
                checkTimestamp(mChangeID, collumn4, mRs.getTimestamp(4)),
                checkString(mChangeID, 5, mRs.getString(5)),
                checkString(mChangeID, 6, mRs.getString(6)));

        if (mSetGant) {
          drc.setmGantFreigabe(getGant(drc.getmFreigabe()));
        }//end if

        if (mTablesAndColumnsString.length > 8) {
          String[] stringValues = new String[mTablesAndColumnsString.length - 8];
          for (int i = 0; i < stringValues.length; i++) {
            stringValues[i] = checkString(mChangeID, i, mRs.getString(countrow));
            countrow++;
          }//end for
          drc.setmStringValues(stringValues);

          if (mPrintDEBU) {
            System.out.println("Stringvalues.length: : " + stringValues.length);
          }//end if
        }//end if

        if (mTablesAndColumnsInt.length > 0) {
          int[] intValues = new int[mTablesAndColumnsInt.length];
          for (int i = 0; i < intValues.length; i++) {
            intValues[i] = checkInt(mChangeID, i, mRs.getInt(countrow));
            countrow++;
          }//end for
          drc.setmIntValues(intValues);

          if (mPrintDEBU) {
            System.out.println("Intvalue.length: " + intValues.length);
          }//end if
        }//end if

        if (mTablesAndColumnsTimestamp.length > 0) {
          Timestamp[] timestampValues = new Timestamp[mTablesAndColumnsTimestamp.length];
          for (int i = 0; i < timestampValues.length; i++) {
            timestampValues[i] = checkTimestamp(mChangeID, mTablesAndColumnsTimestamp[i].substring(0, mTablesAndColumnsTimestamp[i].indexOf(";")), mRs.getTimestamp(countrow));
            countrow++;
          }//end for
          drc.setmTimeStampValues(timestampValues);

          if (mPrintDEBU) {
            System.out.println("Timestampvalue.length: " + timestampValues.length);
          }//end if
        }//end if

        if (mTablesAndColumnsTime.length > 0) {
          Time[] timeValues = new Time[mTablesAndColumnsTime.length];
          for (int i = 0; i < timeValues.length; i++) {
            timeValues[i] = checkTime(mChangeID, i, mRs.getTime(countrow));
            countrow++;
          }//end for
          drc.setmTimeValues(timeValues);

          if (mPrintDEBU) {
            System.out.println("Timevalue.length: " + timeValues.length);
          }//end if
        }//end if

        if (mTablesAndColumnsDate.length > 0) {
          Date[] DateValues = new Date[mTablesAndColumnsDate.length];
          for (int i = 0; i < DateValues.length; i++) {
            DateValues[i] = checkDate(mChangeID, i, mRs.getDate(countrow));
            countrow++;
          }//end for
          drc.setmDateValues(DateValues);

          if (mPrintDEBU) {
            System.out.println("Datevalue.length: " + DateValues.length);
          }//end if
        }//end if

        if (mTablesAndColumnsDouble.length > 0) {
          double[] DoubleValues = new double[mTablesAndColumnsDouble.length];
          for (int i = 0; i < DoubleValues.length; i++) {
            DoubleValues[i] = checkDouble(mChangeID, i, mRs.getDouble(countrow));
            countrow++;
          }//end for
          drc.setmDoubleValues(DoubleValues);

          if (mPrintDEBU) {
            System.out.println("Doublevalue.length: " + DoubleValues.length);
          }//end if
        }//end if

        if (mPrintDEBU) {
          drc.print();
          System.out.println("Status @ DRC: " + mStatus + "\n");
        } else {
          updateProgress();
        }//end else

        if(drc.getmStartTime() == null){
          drc.setmStartTime(new Timestamp(0L));
          mStatus = NULLDATE;
        }//end if

        if(drc.getmEndTime() == null){
          drc.setmEndTime(new Timestamp(0L));
          mStatus = NULLDATE;
        }//end if

        if (getmStatus() == OK || getmStatus() == NULLFIELD) {
          if (drc.getmStartTime().before(drc.getmEndTime())) {
            mDataRecords.add(drc);

            if (mPrintDEBU) {
              System.out.println("DRC added\n");
            }//end if
          } else {
            if (mPrintDEBU) {
              System.out.println(" --------> Invalid Dates @ " + drc.getmUniqueID() + " <--------\n");
            }//end if
            mErrors.add(new Error(drc.getmUniqueID(), "Invalid Dates", drc.getmStartTime().toString(), drc.getmEndTime().toString()));
            mErrorRC++;
          }//end else
        }//end if
      }//end while
      
      if (mPrintINFO) {
        System.out.println("\b" + mSdf.format(new java.util.Date()) + CHECKEND_A + mDataRecords.size() + CHECKEND_C);
      }//end if
      mRs.close();

      if (mPrintDEBU) {
        System.out.println("\n" + mSdf.format(new java.util.Date()) + " --> mRs.close @ checkRecords" + "\n");
      }//end if

      mLoadStmt.close();

      if (mPrintDEBU) {
        System.out.println("\n" + mSdf.format(new java.util.Date()) + " --> mLoadStmt.close @ checkRecords" + "\n");
      }//end if

      mStatus = OK;

    } catch (SQLException s) {
      printOut(s, CHECKERROR);
    } catch (Exception ex) {
      printOut(ex, CHECKERROR);
    }//end catch

    if (mPrintDEBU) {
      System.out.println("Status " + LOADERROR + ": " + mStatus + "\n");
    }//end if
  }//end methode

Hoffe das ist nicht zuviel und ich könnt noch einigermassen nachvollziehn was ich tue...

Was ich gerade noch gesehen habe ist, dass ich für jeden Datentap in jedem Record ein neues Arry erzeuge. Dies sind zwar auch Objekte die zur Laufzeit bestehen, aber der garbage collector sollte die wieder eliminieren. Ev bin ich aber zu schnell für den GC mit dem erzeugen der Objekte. Ich könnte also die Arrays aus der Schlaufe nehmen, diese einmal erzeugen und dann jeweils überschreiben. Immer in der Hoffnung, dass ich alle Werte des vorherigen Record wegkriege. Sonst ist der Datensalat perfekt :eek: Ob das der richtige Weg ist ???

Danke und Gruss

Nahum77
 

Natac

Bekanntes Mitglied
Kann es sein, dass da ein
Code:
mRs.close()
am ende fehlt? Poste doch auch bitte mal den umliegenden Code, da man bei dir jetzt nicht sieht, wie ein ResultSet erzeugt wird, oder wie bspw
Code:
mTablesAndColumnsString
zu Stande kommt.

Nach deinem Phänomen zu urteilen läuft der Speicher voll, was mich darauf schließen lässt, dass du irgendwo noch Referenzen auf ein Objekt hälst, dass du eigentlich gerne dem GC anvertraut hättest.
 
S

SlaterB

Gast
generelle Langsamkeit spricht doch kaum für vollen Speicher?
evtl. Stocken vielleicht..

ich sehe Langsamkeit immer mit Unmengen an Arbeit verbunden, z.B. wenn man an einen schon MB-großen String ein Zeichen anfügt musst der gesamte String mit Millionen Zeichen umkopiert werden,
ähnlich evtl. bei Listen

Tipp:
arbeite stufenweise, laufe zunächst nur das ResultSet durch und erhöhe eine Variable um 1 bzw. miss die Zeiten,
wie lange für erste 1000, zweite 1000 usw.,
wenn unmessbar schnell, immer 0 ms, dann immerhin im grünen Bereich,

vom ResultSet kann auch in ein Object[][] oder so umkopiert werden, dann muss man über ResultSet nicht mehr nachdenken,
mit Pech ist das genauso langsam, aber kann man auch als gewisses Glück bezeichnen, dann hat man das Problem zumindest nur noch in 10 Zeilen, der Rest unübersichtlichen Code spielt keine Rolle,

eher ist aber anzunehmen dass ein leerer Durchlauf oder auch ein Umkopieren schnell geht,
danach dann die Verarbeitung stufenweise einfügen, so gut das eben geht,

erst den einen Check, immer noch schnell?
dann den nächsten, usw.

vielleicht ist genau ein bestimmter Block a la
Java:
        if (mTablesAndColumnsTime.length > 0) {
          Time[] timeValues = new Time[mTablesAndColumnsTime.length];
          for (int i = 0; i < timeValues.length; i++) {
            timeValues[i] = checkTime(mChangeID, i, mRs.getTime(countrow));
            countrow++;
          }//end for
          drc.setmTimeValues(timeValues);
 
          if (mPrintDEBU) {
            System.out.println("Timevalue.length: " + timeValues.length);
          }//end if
        }//end if
Schuld, dann den genauer anschauen, zu unterteilen versuchen usw.
 

Bernd Hohmann

Top Contributor
"mDataRecords" ist vermutlich eine Arraylist und DataRecord wird nicht gerade klein sein.

Eines der Probleme kann darin bestehen, dass er beim vergrössern des internen Arrays der Liste verhungert.

Man müsste sich mal zur Laufzeit die folgenden Werte anschauen:

Java:
Runtime.getRuntime().maxMemory();
Runtime.getRuntime().totalMemory();
Runtime.getRuntime().freeMemory();

Bernd
 

nahum77

Mitglied
Hallo zusammen

Danke für die Antworten!

Habe den Fehler aber nun an ganz anderer Stelle gefunden.

Ich wollte wissen wie viele Zeilen mein RS enthält. Daher habe ich den Cursor auf scrollsensitive gesetzt:
Java:
mLoadStmt = mSourceConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
bin mit dem Cursor auf den letzten Datensatz gesprungen, habe die Zeile ausgelesen und dann wieder vor den ersten Datensatz gesprungen:

Java:
if (mRs.last()) {
  mLoadRC = mRs.getRow();
  mRs.beforeFirst();
}//end if
Danach habe das RS verarbeitet (oder versucht, denn bei geschätzten 22h Laufzeit hatte ich nie den Nerv bis zum Ende zu warten).

Irgendwo in einem Forum habe ich dann gelesen, dass ein scrollsensitiver Cursor die Verarbeitung massivst beeinträchtigt bis gar verunmöglicht.

Also zurück auf:
Java:
ResultSet.TYPE_FORWARD_ONLY
was auch dem Standart entspricht und siehe da, das ganze dauer noch knapp 40 Sekunden!!!!

Die Anzahl Zeilen hole ich mir nun halt mit einem SELECT COUNT vorab und mach danach den Select nochmal auf die Spalten mit selbem Filter.

Hoff hiervon kann auch mal wer profitieren, war schon eine echt doofe Geschichte...

Grüsse
Nahum77
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
A PostgreSQL anfängerfrage: resultset zeilenweise auslesen Datenbankprogrammierung 2
S ResultSet variabel auslesen Datenbankprogrammierung 4
L JPA EclipseLink PostgreSQL auslesen mit Query Datenbankprogrammierung 2
Zrebna Lediglich interne DB-Verbindungen (Connections) auslesen - mittels Java Datenbankprogrammierung 4
L Oracle Oracle Datumsspalte auslesen Datenbankprogrammierung 5
A Umsätze der Bank auslesen Datenbankprogrammierung 7
G MySQL JDBC Metadaten auslesen aus .accdb -> Primärschlüssel manchmal erkannt manchmal nicht Datenbankprogrammierung 3
F Auslesen einer .dbf-Datei, Zuordnung Index Datenbankprogrammierung 0
NIckbrick MySQL Befehle aus Datenbank auslesen Datenbankprogrammierung 21
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K SQLite Datenbank in App integrieren: Vor Auslesen schützbar? Datenbankprogrammierung 6
K Java Datenbank auslesen Datenbankprogrammierung 8
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
J Onlinedatenbank einmalig auslesen Datenbankprogrammierung 1
E Wie kann ich textdateien, die als BLOB abgespeichert sind, aus der Datenbanktabelle auslesen? Datenbankprogrammierung 23
C MySQL Datenbank auslesen/beschreiben und Zusatz Datenbankprogrammierung 1
R MySQL Blob aus DB auslesen und einer Tabelle ausgeben Datenbankprogrammierung 7
E primaryKey auslesen - Datensätze abgleichen Datenbankprogrammierung 4
R MS-Access mit JAva auslesen Datenbankprogrammierung 7
2 MySQL Daten aus einer Array auslesen und MySQL Statment erstellen. Datenbankprogrammierung 5
E Tabellen nacheinander auslesen Datenbankprogrammierung 10
N HSQLDB Daten Auslesen Datenbankprogrammierung 3
E Werte auslesen Datenbankprogrammierung 3
O Metadaten / DatenbankAttribute Auslesen Datenbankprogrammierung 4
D Alle Werte aus DB auslesen und in Chart darstellen Datenbankprogrammierung 6
Ollek Auslesen DatenbanktabelleDatei iSeries Datenbankprogrammierung 10
C H2 Letzten Eintrag auslesen Datenbankprogrammierung 6
D MySQL Bild aus DB auslesen und auf FTP Speichern Datenbankprogrammierung 7
N Oracle txt. Datei auslesen-> verändern-> einlesen Datenbankprogrammierung 7
M JPA - Datenbanktabellen auslesen Datenbankprogrammierung 14
F NUR 3 datensätze auslesen Datenbankprogrammierung 6
M Datenbank (MySQL) auslesen Datenbankprogrammierung 3
S MySQL Datenbank auslesen - Treiberproblem Datenbankprogrammierung 12
F MySQL SSH Datenbank auslesen Datenbankprogrammierung 3
D Blob MimeTyp auslesen Datenbankprogrammierung 2
S Verschiedene Informationen gleichen Typs speichern und auslesen Datenbankprogrammierung 4
D Hibernate: ArrayList in DB speichern und auslesen Datenbankprogrammierung 4
S Werte aus Datenbank auslesen und in eine bestimmte Excelzelle eintragen Datenbankprogrammierung 2
P MySQL Objekt aus BLOB auslesen Datenbankprogrammierung 3
B String aus txtDatei auslesen und in Datenbank schreiben. Datenbankprogrammierung 8
B häppchenweises auslesen "lazy loading" von Datenbank Datenbankprogrammierung 13
D Csv auslesen und in mysql db schreiben Datenbankprogrammierung 9
K PostgreSQL PDF-Dateien in Datenbank speichern und auslesen Datenbankprogrammierung 4
E Datenbank auslesen mit JAVA Datenbankprogrammierung 2
W MySQL Datenbanken auslesen Datenbankprogrammierung 3
H DB auslesen (Hibernate, Query, Parameter) Datenbankprogrammierung 8
J Tabelle auslesen- knifflig Datenbankprogrammierung 7
W bestimmte Zeile mit bestimmter Spalte auslesen Datenbankprogrammierung 11
Plastagen DBC Dateien korrekt auslesen Datenbankprogrammierung 2
O vernümpftig Datumsangabe in mySQL DB speichern und auslesen Datenbankprogrammierung 4
M Derby insert, ID auslesen Datenbankprogrammierung 3
S Java objekt in MYSQL auslesen Datenbankprogrammierung 32
R Update Time auslesen Datenbankprogrammierung 2
A Datenbankanbindung an mySQL und Ein-/Auslesen der Daten Datenbankprogrammierung 4
MQue speziell Auslesen aus Datenbank Datenbankprogrammierung 5
C MP3 in DB als Blob, wieder auslesen und als MP3 speichern??? Datenbankprogrammierung 8
Antoras Passwort aus DB auslesen Datenbankprogrammierung 12
V tabellenName aus den Metadaten auslesen Datenbankprogrammierung 4
L primärschlüssel auslesen Datenbankprogrammierung 6
G Bild aus als OLE-Typ aus MS Acces auslesen Datenbankprogrammierung 3
G Namen der Datebank aus einer Connction auslesen Datenbankprogrammierung 3
S Fehler beim Auslesen von Daten Datenbankprogrammierung 6
G Daten schneller aus einer DB auslesen Datenbankprogrammierung 9
T Metadaten Auslesen Datenbankprogrammierung 7
B Spaltennamen von MySQL Datenbank nach Java auslesen Datenbankprogrammierung 10
A Auslesen von Werten aus der DB in eine csv-Datei Datenbankprogrammierung 4
A Auslesen aus einer csv-Datei Datenbankprogrammierung 2
N Unbekannte Datenbank über Metadaten auslesen? Datenbankprogrammierung 9
A Funktionale Abhängigkeiten auslesen Datenbankprogrammierung 4
T Datenbanknamen eines Datenbankservers auslesen Datenbankprogrammierung 9
thE_29 Byte auslesen mit MS SQL Server Datenbankprogrammierung 4
W Auslesen von Tabellen einer MYSql Datenbank Datenbankprogrammierung 25
M Preparedstatement SQL-string auslesen Datenbankprogrammierung 13
M Mysql datenbank auslesen und mittels servlet wiedergeben Datenbankprogrammierung 3
G Oracle-Record auslesen Datenbankprogrammierung 2
M Letzter Datensatz mit auslesen(brauch kleinen Tipp) Datenbankprogrammierung 15
G Spalten Namen auslesen und Zeilen daten auslesen Datenbankprogrammierung 17
F JDBC Abfrage Werte auslesen Datenbankprogrammierung 2
V mysql - tree auslesen und richtig ordnen Datenbankprogrammierung 4
G DB auslesen und in ein JTextArea schreiben Datenbankprogrammierung 3
Z Auslesen aus einer mySQL Datenbank Datenbankprogrammierung 4
P MYSQL werte aus liste auslesen und anderen damit updaten Datenbankprogrammierung 4
T Creates der Datenbank auslesen Datenbankprogrammierung 10
W datenbankschema auslesen Datenbankprogrammierung 3
S Daten aus einer MySQL-Datenbank auslesen Datenbankprogrammierung 7
S metadaten/Tabellen des sqlservers auslesen Datenbankprogrammierung 8
S Tabellen auslesen in einer DB Datenbankprogrammierung 14
P Primärschlüssel direkt nach der Eingabe wieder auslesen Datenbankprogrammierung 7
M MySQL Tabellen in java auslesen? Datenbankprogrammierung 5
L DB Felder in einem Array speichern und wieder auslesen Datenbankprogrammierung 11
V MAX Wert und weitere auslesen Datenbankprogrammierung 2
D Zufällige Zeile auslesen Datenbankprogrammierung 6
G Auslesen und in TextBox anzeigen lassen Datenbankprogrammierung 7
D Problem mit auslesen deiner DBase Datenbank Datenbankprogrammierung 8
R Einen Integer-Wert aus einer MySQL DB auslesen Datenbankprogrammierung 2
G speichern und auslesen von daten aus einer datenbank Datenbankprogrammierung 8
X Vectoren in mySQL-Datenbank speichern und auslesen Datenbankprogrammierung 8
L Tabellennamen auslesen Datenbankprogrammierung 2
M Tablen auslesen und als Tree anzeigen lassen Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben