Frage

Ich habe eine Web-Anwendung im Frühjahr, die zum Erzeugen einer CSV / Excel-Tabelle aus einer Ergebnismenge kommt aus einer großen Oracle-Datenbank eine funktionale Anforderung hat. Die erwarteten Zeilen sind in dem 300.000 - 1.000.000 Bereich. Zeit zum Prozess nicht so groß ein Problem ist als die Anwendung stabil zu halten - und gerade jetzt, sehr große Ergebnismengen dazu führen, dass der Speicher und Absturz laufen

.

In einer normalen Situation wie diese, würde ich Paginierung verwenden und die Benutzeroberfläche zu einem Zeitpunkt nur eine begrenzte Anzahl von Ergebnissen angezeigt werden soll. Allerdings ist in diesem Fall, dass ich in der Lage sein, den gesamten Satz in einer einzigen Datei zu erzeugen, egal wie groß es auch sein mag, für die Offline-Nutzung.

Ich habe das Problem auf die ParameterizedRowMapper isoliert verwendet wird, um die Ergebnismenge in Objekte zu konvertieren, das ist, wo ich bin stecken.

Welche Techniken könnte ich in der Lage sein zu verwenden, um diesen Vorgang unter Kontrolle zu bekommen? Ist Paginierung immer noch eine Option?

War es hilfreich?

Lösung

Ich würde zurückzudrängen auf diejenigen Anforderungs- sie ziemlich künstlich klingen. Was passiert, wenn Ihre Anwendung fehlschlägt oder der Strom ausfällt, bevor der Benutzer schaut auf diese Daten?

Von Ihrem Kommentar oben, klingt wie Sie die Antwort- wissen Sie Dateisystem braucht oder Oracle-Zugang, um Ihre Arbeit zu tun.

Sie werden gebeten, eine Daten-, etwas zu erzeugen, die von SQL nicht wiederholbar ist? Wenn es wiederholbar sind, würden Sie gerade in einer Zeit, Seiten von Daten zurück an den Benutzer zu senden.

Seit diesem Bericht, ich bin zu raten, etwas mit dem aktuellen Zustand Ihrer Daten zu tun, müssen Sie dieses Ergebnis irgendwo speichern, wenn Sie es nicht streamen können den Benutzer aus. Ich würde eine gespeicherte Prozedur in schreiben Oracle- es ist viel schneller nicht um Daten zu senden hin und her über das Netzwerk. Wenn Sie spezielle Tools haben oder es ist nur einfacher, klingt wie es ist nichts falsch mit ihm auf der Java-Seite tun, statt.

Können Sie planen diesen Bericht einmal pro Woche laufen?

Andere Tipps

Eine einfache Antwort:

Verwenden Sie einen JDBC-Cord (oder etwas ähnliches, mit einem entsprechenden Array / Fetch-Größe) und schreibt die Daten eine LOB zurück, entweder vorübergehend oder zurück in die Datenbank.

Eine andere Wahl:

Mit PL / SQL in der Datenbank eine Datei mit UTL_FILE für Recordset im CSV-Format zu schreiben. Da die Datei auf dem Datenbankserver sein wird, nicht auf dem Client, Verwendung UTL_SMTP oder Java Mail mit Hilfe von Java Stored Procedures, die Datei zu senden. Immerhin würde ich überrascht sein, wenn jemand die Sanduhr umdrehen wiederholt Warten auf eine 1 Million Reihe Cord-Set beobachten würde generiert werden.

Anstatt eine gesamte Datei in den Speicher zu laden Sie jede Zeile verarbeiten kann einzeln und Verwendung Ausgangsstrom die Ausgabe direkt an den Web-Browser zu senden. Z.B. in Servlets API können Sie den Ausgangsstrom von ServletResponse.getOutputStream () und dann einfach Schreib Ergebnis CSV Zeilen zu diesem Strom.

Haben Sie die Leistung einer Excel-Tabelle mit 1.000.000 Zeilen betrachtet?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top