Announcement

Collapse
No announcement yet.

ResultSet in eine CSV Datei schreiben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ResultSet in eine CSV Datei schreiben

    Hallo Leute,

    ich muss zur Zeit 4500 Datensätze (23 Spalten) aus einer Oracle DB auslesen und möglichst schnell in eine CSV-Datei speichern. Das Auslesen funktioniert ohne weiteres. Ich versuche dann auch gleich (entsprechend aufbereitet) die Daten in die CSV Datei zu speichern, aber an dieser Stelle ist auch Schluss mit Lustig. Das ganze für lange Zeit auf. Die Performanz ist garnicht gegeben.

    Das einlesen in die Datei mache ich mit folgendem Code-Abschnitt:

    Code:
    File ausgabeDatei = new File(context.getRealPath("report/report.csv"));
    			
    PrintWriter out = new PrintWriter(new FileWriter(ausgabeDatei));
    
    	String quote = "\"";
    	String sep = ";";
    	while (result.next()) {
    	    for(int i = 1; i <= 23; i++)
    	        out.print(quote + result.getString(i) + quote + sep);
    	    outprintln();
    	}
    	out.close();
    wobei "result" ist mein ResultSet.

    Hat jemand eine Idee für die Steigerung der Performanz an dieser Stelle?

    Für eine Antwort wäre ich sehr dankbar.

    Gruss

    Vitali

  • #2
    Hallo,

    probiere mal den BufferedWriter aus. Damit sollte es wesentlich schneller funktionieren.

    Gruß
    Olli

    Comment


    • #3
      Hallo Vitali,

      zusätzlich zum Tipp von Olli würde ich innerhalb der while-Schleife einen StringBuffer (synchronisiert) oder StringBuilder (nicht synchronisiert) zum Zusammenbauen des Strings aus einem Datensatz des ResultSets verwenden.

      Das Konkatenieren von Strings ist nicht gerade performant.

      D.h. in der ersten Zeile innerhalb der while-Schleife würde ich einen neuen StringBuffer oder StringBuilder erzeugen und alle Strings in diesen schreiben und anschließend am Ende der while-Schleife dem BufferedWriter den kompletten Datensatz übergeben.

      Das dürfte schneller gehen.

      In der Hoffnung, geholfen zu haben,
      Stefan

      Comment


      • #4
        Die obigen Tips sind natürlich richtig, ich würde dennoch mal überprüfen wo eigentlich die Zeit draufgeht. Nur weil das ResultSet da ist (der select also ausgeführt), heißt es ja nicht, da er sämtliche Daten in seinem client-side cache hält. Da sind beim iterieren sicherlich viele Server-Zugriffe nötig.

        Ich kenne Deine Anforderungen nicht, aber wenn es einfach um den Export einer Tabelle geht ist JDBC ev. nicht die schnellste Lösung Du könntest z.b. ein SQL-Script basteln das den select absetzt und das Ergebnis in eine Datei umlenken. Das Script kann man, wenn es sein muß, ja auch über ein Java-Programm starten. Vielleicht ist das schneller. Bei MySQL kann man mit "select * from table into file.csv" direkt einen Export machen. Keine Ahnung was es alles für Möglichkeiten bei Oracle gibt um so etwas schnell zu bewerkstelligen.

        Comment


        • #5
          SQL Statement

          Hallo Leute danke für die Antworten, ich glaube mittlerweile, dass es an dem SQL Statement liegt. Habt ihr einen Vorschlag, wie man in schneller machen kann?

          Code:
          select c.TITLE, c.HEADING, c.LASTMODIFIED, dt.NAME AS CONTENTTYPE, c.VALIDATED, c.DRAFT, c.PUBLISHED, c.PUBLISHDATE, c.EXPIRED, c.EXPIRYDATE,
          c.ISREGISTRATIONCONTENT AS REGISTRATION, c. ISPAYCONTENT AS PAYCONTENT, ws.NAME AS WORKFLOWFSTAGE_NAME, w.NAME AS WORKFLOW_NAME,
          
            rowtocol('SELECT CATEGORYNAME FROM WCM_DOCUMENT_CATEGORIES docCat JOIN WCM_CATEGORY cat ON cat.ID = docCat.CATEGORYID WHERE TAXONOMYNAME=''Dienstleistung'' AND DOCUMENTID=' || c.ID, ':') as DIENSTLEISTUNG,
            rowtocol('SELECT CATEGORYNAME FROM WCM_DOCUMENT_CATEGORIES docCat JOIN WCM_CATEGORY cat ON cat.ID = docCat.CATEGORYID WHERE TAXONOMYNAME=''Branche'' AND DOCUMENTID=' || c.ID, ':') as BRANCHE,
            rowtocol('SELECT CATEGORYNAME FROM WCM_DOCUMENT_CATEGORIES docCat JOIN WCM_CATEGORY cat ON cat.ID = docCat.CATEGORYID WHERE TAXONOMYNAME=''Line of Service'' AND DOCUMENTID=' || c.ID, ':') as LOS,
            rowtocol('SELECT CATEGORYNAME FROM WCM_DOCUMENT_CATEGORIES docCat JOIN WCM_CATEGORY cat ON cat.ID = docCat.CATEGORYID WHERE TAXONOMYNAME=''Themen'' AND DOCUMENTID=' || c.ID, ':') as THEMA,
            rowtocol('SELECT CATEGORYNAME FROM WCM_DOCUMENT_CATEGORIES docCat JOIN WCM_CATEGORY cat ON cat.ID = docCat.CATEGORYID WHERE TAXONOMYNAME=''Unternehmensform'' AND DOCUMENTID=' || c.ID, ':') as UNTERNEHMENSFORM,
            rowtocol('SELECT VALUE FROM WCM_KEYWORD keyword JOIN WCM_DOCUMENT_KEYWORDS docKey ON keyword.ID = docKey.KEYWORD_ID where keyword.status = ''Vorschlag'' AND DOCUMENT_ID=' || c.ID, ':') as KEYWORDS_VORSCHLAG,
            rowtocol('SELECT VALUE FROM WCM_KEYWORD keyword JOIN WCM_DOCUMENT_KEYWORDS docKey ON keyword.ID = docKey.KEYWORD_ID where keyword.status = ''Freigegeben'' AND DOCUMENT_ID=' || c.ID, ':') as KEYWORDS_FREIGEGEBEN,
            
            rowtocol('SELECT PATH FROM WCM_REPORT_VERORTUNG WHERE ID=' || c.ID, ':') as VERORTUNG,
            
            rowtocol('SELECT DISPLAYNAME FROM WCM_DOCUMENT_EDITORS docEd JOIN WCM_DOCUMENT_EDITOR ed ON ed.ID = docEd.DOCUMENTEDITORID WHERE DOCUMENTID=' || c.ID, ':') as EDITOR
            
          from WCM_CONTENT_NODE c JOIN WCM_WORKFLOW_STAGE ws ON c.WORKFLOWSTAGE = ws.ID
          JOIN WCM_WORKFLOW w ON c.WORKFLOW = w.ID
          JOIN WCM_DOCUMENT_TYPE dt ON c.DOCUMENTTYPE = dt.ID
          where c.NODETYPE = 'Document';
          Vor allem in Hinblick auf "rowtocol" Anweisung.

          Gruss

          Vitali

          Comment

          Working...
          X