# Webanwendung mit intensiver Nutzung von Dateien



## JanHH (12. Mai 2016)

Plane eine Anwendung, wo es aus bestimmten Gründen sinnvoll erscheint, mit Dateien (Textdateien) zu arbeiten, also Dateisystem statt Datenbank (bzw beides). Die Dateien werden dabei nur gelesen, nicht geschrieben/geändert.

Meine Frage - "darf" man das oder gibt es irgendwo in den JEE-Spezifikationen ein Verbot? Jee6/Jboss 7.1.1. Gibt es gute Gründe dagegen? Mir ist klar dass Clustering und load balancing dann schwierig wird, aber das ist auch nicht notwendig in diesem Fall.

Blöd wäre nur, wenn es zwar funktioniert, aber eher aus Zufall, und bei irgendeinem Update irgendeiner der beteiligten Komponenten nicht mehr geht, weil man es "offiziell nicht darf". Kenne mich da nicht so aus.


----------



## klauskarambulut (12. Mai 2016)

Macht man ja auch schon oft so.

Ein ResourceBundle ist auch nur eine Textdatei, die beim Build in ein Jar oder bei JEE in ein war mitgepackt wird.

Kann man also grundsätzlich machen, Dateien in ein Artefakt reinzulegen. Also config files, Templates,  etc. Schreibender Zugriff ist damit aber auch ausgeschlossen.

Außerhalb ist immer problematisch, weil man hier zusätzliche Konventionen braucht und das Problem hat das hier immer was schiefgehen kann. Unterschiedliches Filesystem, Windows, Linux mit den jeweiligen Konventionen.
Berechtigungen sind das nächste. Unter welchem User läuft der Server, welche Dateiberechtigungen soll dieser bekommen? Natürlich möglichst wenig um wenig Angriffsfläche zu bieten.
Dazu kommen beim schreibenden Zugriff Synchronisationsprobleme hinzu, da JEE idR Multithreading ist.

Und beim lesen ist das Problem, wann welche Dateien in welchem Zustand gelesen werden.

Ein Beispiel bei dem geschrieben wird sind z.B. Logfiles.

Kurz, kann man machen, sollte man aber vermeiden.

Geht man nun aber weiter in Richtung Cloud, Azure, AWS, GAE, dann schließen die afaik zugriffe aufs Dateisystem kategorisch aus, bieten dafür aber andere Services zur Datenhaltung an.


----------



## JanHH (12. Mai 2016)

Die Dateien haben einen einzigen Zustand und ändern sich nie..

Das mit den Rechten stimmt, aber das ist ja auch nur eine einmalige Konfigurationssache.

Workaround wäre, jede Datei als String in der Datenbank zu speichern ;-). Mal schauen.

Aber wenn man es "darf" bzw "kann" ist es für das was mir vorschwebt vermutlich wirklich die beste Lösung.


----------



## BuckRogers (13. Mai 2016)

Wo werden denn die Textdateien erstellt? Aus der Anwendung oder sind sie Bestandteil der Sourcen? 
Wenn sie zur Codebase gehören kann man sie getrost in die resourcen packen wie @klauskarambulut schon meinte. Wenn du sie in die Datenbank packst, dann hast du einen kleinen Aufwand sie da rein zu bekommen und musst auch sicherstellen dass sie nicht verloren gehen und jederzeit abrufbar sind. 
Persönlich würde ich Texte, welche nie geändert werden und nur einmal erstellt werden, in die resourcen packen.


----------



## stg (13. Mai 2016)

Es ist durchaus legitim und auch üblich das Filesystem für die Ablage zu benutzen. Insbesondere sollte man "große" Dateien in der Datenbank eher vermeiden, solange es nicht triftige Gründe dafür gibt sie dort abzulegen.

In Erwägung ziehen könntest du auch einen "Mix", und zwar den Pfad zur Datei in der Datenbank abzulegen. Auf diese Weise kannst du deine Textdateien auch ganz bequem und sicher während der Laufzeit des Programms austauschen.


----------



## JanHH (13. Mai 2016)

Die besagten Dateien enthalten Daten, die von Kunden geliefert und verarbeitet werden (nach und nach, nicht schon zur Erstellungszeit der Software).

Danke für alle Antworten.


----------



## dayaftereh (13. Mai 2016)

Du könntest überlegen ein Asynchronen Ansatz zu verfolgen, da dein Webserver seine meiste Zeit auf IO oder das Filesystem warte, dadurch würde der Server total Leichtgewicht für das System werden, anstatt die Komplette JEE Umgebung hoch zu fahren. Ich würde sogar sagen das du Komplett mit einem Thread auskommst...


----------



## Bitfehler (14. Mai 2016)

Es wurden ja schon einige Ansätze vorgetragen, wie man das der Software heraus dieses Problem angehen könnte. Zusätzlich hierzu fällt mir noch eine Sache ein. Laut der Aussage ändern sich die Dateien nicht, daher könnte man die Dateien problemlos in eine RAM-Disk legen und die angesprochene IO/Performance-Problematik so zu lösen/entschärfen. Unter Linux gibt es Tutorials wie man eine RAM-Disk erstellt und einbindet. Bei Windows bin ich raus.


----------



## JanHH (14. Mai 2016)

Hm, aber wenn man Dateien verwenden "darf", bestehen eigentlich gar keine Probleme mehr. Dann mache ich das einfach so, und gut ist. Alles geklärt.


----------

