# grosse Textdatei in Webanwendung importieren



## JanHH (31. Okt 2009)

Hallo,

bei einem Projekt ist eine Funktionalität notwendig, um grössere Datenmengen, die als csv-Datei (excel-Textexport) vorliegen, zu importieren. Diese Dateien können durchaus mal mehrere MB gross werden (es handelt sich teilweise um Tabellen mit zehntausenden von Zeilen). Die csv-Dateien sollen analysiert und ihre Inhalte in der Datenbank der Applikation gespeichert werden.

An sich kein Problem, die Frage ist nur, inwiefern eine Webapplikation auf eine Textdatei zugreifen kann. Mein erster Ansatz war: Die Applikation läuft im Tomcat, die Dateien liegen in einem dafür explizit definierten Verzeichnis auf dem Webserver (wo sie per ftp oder scp hinkopiert werden), und die Webanwendung importiert sie dann halt nach Klick auf einen Button.

Nun soll die Applikation jedoch nicht im Tomcat, sondern in einem richtigen JEE-Application Server (vermutlich JBoss) laufen, und soweit ich weiss, ist es dann keine gute Idee mehr, aufs Dateisystem zugreifen zu wollen (und sogar wenn es funktionieren sollte, is es nicht gemäß der JEE-Spezifikationen).

Was also tun?

Ein Ansatz wäre, die Dateien per webbasiertem Datei-Upload in die Datenbank schreiben zu lassen (als CLOB oder sowas), dann aus der Datenbank zu lesen und zu verarbeiten. Allerdings kommt mir ein Datei-Upload per HTTP bei 20 MB grossen Dateien eher unpraktikabel und sehr störanfällig vor (wegen Übertragungsraten, Session-Timeout usw.).

Eine andere Idee, die ich spontan favorisiere, ist, das ganze Lesen und Analysieren der CSV-Datei auf einem lokalen PC per java-Swing-Anwendung zu machen, welche die Daten dann per jdbc/JPA auf den entfernten Server schreibt. Ich vermute, es ist möglich, eine JDBC-Verbindung übers Internet zu einer Datenbank auf einem entfernten Server aufzubauen? Aber auch da stellt sich die Frage, was tun, wenn die Verbindung zwischendurch aufgrund von Internet-Störungen unterbrochen wird?

Bin für Ideen und Hinweise dankbar.

Gruß
Jan


----------



## SlaterB (2. Nov 2009)

hast du Links zur These 'keine gute Idee mehr, aufs Dateisystem zugreifen zu wollen', ist mir neu

wenn eine Anwendung JSP-Dateien oder sonstige Nicht-.class-Dateien verarbeitet, wieso nicht auch auch Informationen aus txt/ csv?
sofern man ftp/ scp vertraut und da mit den Rechten alles in Ordnung ist, dem eigenen Dateisystem muss ein Programm doch eh am ehesten trauen, da könnte ja alles mögliche geändert werden,
und per Web kann man doch genauso Txt-Murks übertragen

> Ich vermute, es ist möglich, eine JDBC-Verbindung übers Internet zu einer Datenbank auf einem entfernten Server aufzubauen? 

das wäre für mich eher ein Sicherheitsrisiko bei Vollzugriff..,
ftp/ scp kann man vielleicht genauso missbrauchen, aber wenn die Daten dort nur als Text analysiert werden und Löschen/ Platte vollschreiben usw. verhindert ist, dann gehts ja noch,

kann man freilich vielleicht auch in der DB so einrichten (eingeschränkter Upload-Zugang), dann eher äquivalent


----------



## maki (2. Nov 2009)

> hast du Links zur These 'keine gute Idee mehr, aufs Dateisystem zugreifen zu wollen', ist mir neu


Ist laut EJB Spek. verboten, funzt nicht so gut im Cluster und Dateisystemzugriffe über java.io.File sind  auch nicht transaktional.



> Ein Ansatz wäre, die Dateien per webbasiertem Datei-Upload in die Datenbank schreiben zu lassen (als CLOB oder sowas), dann aus der Datenbank zu lesen und zu verarbeiten. Allerdings kommt mir ein Datei-Upload per HTTP bei 20 MB grossen Dateien eher unpraktikabel und sehr störanfällig vor (wegen Übertragungsraten, Session-Timeout usw.).
> 
> Eine andere Idee, die ich spontan favorisiere, ist, das ganze Lesen und Analysieren der CSV-Datei auf einem lokalen PC per java-Swing-Anwendung zu machen, welche die Daten dann per jdbc/JPA auf den entfernten Server schreibt. Ich vermute, es ist möglich, eine JDBC-Verbindung übers Internet zu einer Datenbank auf einem entfernten Server aufzubauen? Aber auch da stellt sich die Frage, was tun, wenn die Verbindung zwischendurch aufgrund von Internet-Störungen unterbrochen wird?


Ja, das wären 2 Optionen.

Ansonsten kann man auch von einem JEE Server auf Dateien zugreifen ohne gegen die SPek zu programmieren, in dem man einen JCA Adapter für Dateizugriffe nutzt.


----------



## SlaterB (2. Nov 2009)

stimmt, bei Clustern mag da was sein, 
da bräuchte man ein bestimmtes Teilprogramm welches definitiv auf einem Server liegt,

ich weiß ja nicht, ob ein lokales Zusatzprogramm da sauberer ist.., 
und wenn das nun von der Datei einliest ist das genausowenig transaktional, die Brücke kann man nie schließen  ,
aber das sind nur Anmerkungen, da kann ich nix genaues beitragen


----------



## maki (2. Nov 2009)

> stimmt, bei Clustern mag da was sein,
> da bräuchte man ein bestimmtes Teilprogramm welches definitiv auf einem Server liegt,


In einem EJB Cluster weiss man eben nie, auf welchem Server die EJBs laufen werden, kann sich auch jederzeit (zur Laufzeit) ändern, ohne Ankündigung.
Da ist ein Zugriff auf das Filesystem über java.io.File eben nicht wirklich empfehlenswert.



> ich weiß ja nicht, ob ein lokales Zusatzprogramm da sauberer ist..,


Naja, beim Client gibt es da weniger Einschränkungen.



> und wenn das nun von der Datei einliest ist das genausowenig transaktional, die Brücke kann man nie schließen


rofl
Doch kann man, mit JCA eben.
Die Datei die gelesen wird könnte sich ja ändern während man liest wenn man java.io.File nutzt, JCA sorgt dafür dass sich alles den globalen Transaktionen des JEE Servers unterordnet.


----------



## SlaterB (2. Nov 2009)

maki hat gesagt.:


> rofl


was ist denn das für ein Ton?

und was immer du mit JCA meinst kann ich nicht näher kommentieren,
ich sage nur dass irgendwer irgendwann die Datei von der Festplatte einlesen muss, wenn sie dort liegt,
egal wer es macht, dieser Schritt wird immer 'nicht transaktional' sein, also ist das kein Grund, das an einen Client auszulagern
(Cluster gerne)


----------



## FArt (4. Nov 2009)

Auch aus einem Applikationsserver darf man auf Files zugreifen, aber eben nicht aus EJBs, denn wie schon gesagt ist das laut Spec verboten.

Ich finde es in allen Enteprise-Umgebungen nicht sinnvoll, mit Files zu arbeiten (z.B. direkt aus einem Servlet usw.). Besser ist es die Ressourcen über einen im Server installierten Connector und ResourceAdapter zur Verfügung zu stellen (gerade in JBoss!).

Gerade bei großen Dateien wäre das sinnvoll, denn die wirst du sicherlich nicht auf einen Rutsch in den Speicher ziehen wollen.


----------



## JanHH (4. Nov 2009)

Danke für die rege Diskussion. Nach "JCA Adapter" muss ich wohl mal googlen, nie gehört. den Begriff..

Mir ist dann noch eine Variante eingefallen, die mir bisher am besten erscheint: Man kopiert die Datei per ftp/scp auf den Server, loggt sich dort auf der Kommandozeile ein (ist ein Linux-System), und startet dort ein java-Programm, so ein "klasssiches altes" mit Kommandozeile und main-Methode, welches sich ebenfalls per JPA mit der Datenbank verbindet, die Datei liest und in der Datenbank speichert.


----------

