# Hibernate Blob mit Stream speichern



## SlaterB (23. Sep 2008)

hallo,

ich kann bisher mit Hibernate ganz ordentlich einen Blob speichern,
wenn ich die Daten als ein großes byte[] im Speicher vorliegen habe,
etwa

X x = new X();
x.setFile(Hibernate.createBlob(byte[]));
session.save(x);

ist es in einer Form möglich, das ganze durchzuführen, ohne den Arbeitsspeicher so stark zu belasten?
wenn ich 5 MB in einen FileOutputStream schreibe, dann wird das ja hoffentlich gleich an die Festplatte weitergeleitet,

aber mit ByteArrayOutputStream -> byte[] ist das ein großes Array im Speicher,
kann ich Hibernate den Stream mitgeben und dafür sorgen, dass die Daten während des Schreibens in den Stream direkt an die DB weitergeleitet werden
oder was immer da ein sinnvolles Vorgehen ist?
erst auf der Festplatte ablegen?

ich habe bisher keine Speicherprobleme, überlege nur, wie man sowas bauen sollte


----------



## maki (23. Sep 2008)

Kenne persönlich keinen anderen Weg, würde mich aber auch freuen von einem zu hören.

Die Projekte die ich kenne sollen alle mehr als 4GiB () an Dateien speichern, deswegen scheidet die Speicherung als BLOB in der DB aus (keine der großen Enterprise Dbs im Einsatz wie DB2 oder Oracle), ausserdem braucht das eben viel RAM, da werden die Dateien eben auf die Platte geschrieben und ein Background Job prüft nächtlich ob die Referenzierten Dateien auch noch auf der Festplatte vorliegen und ob es unreferenzierte Leichen gibt.


----------



## FArt (23. Sep 2008)

Ich würde erwarten, dass mit Hibernate in Anlehnung an JDBC kein Rückschritt zu erwarten ist... bei JDBC setzt man BLOBs in der Regel über Streams.

Habe nur mal Google angeworfen und das gefunden:
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Hibernate.html#createBlob(java.io.InputStream)

Ist das so was?


----------



## SlaterB (23. Sep 2008)

tja, spricht für Zwischenspeicherung auf der Festplatte (InputStream statt OutputStream)
und es ist zu hoffen, dass dabei nicht auch wieder ein ganzes byte[] eingelesen wird,

kurzer Blick in den Quellcode sah bisher zumindest nicht schlecht aus,
werde ich also im Hinterkopf behalten, falls die Zeit der Notwendigkeit naht,

ausführliche Praxiserfahrungen dürfen dennoch weiter gepostet werden 

-----


ich überlege ja vor allem, im Java-Programm einen OutputStream zu füllen,

ideal wäre, das Blob erst mit Stream zu verknüpfen (einen Output kann man sicher auch irgendwie in einen Input ummöbeln),
dann save() aufzurufen, was aber erstmal noch nicht saved,
dann den OutputStream zu füllen, was auf magische Weise im Hintergrund an Hibernate weitergeleitet wird,
und bei einem close() wird auch Hibernate fertig sein

gerne auch mit nebenläufigen Threads, gerne auch mit anderen/ weiteren/ abschließenden Aufrufen als session.save(), mit Status-Überprüfungen usw.

hmm, bei mehreren Threads klingt das gar nicht mehr so abgedreht wie im Absatz dadrüber,
wenn das Blob beim save() aus der Datei lesen kann, dann doch wohl auch aus einem InputStream, der erst im Programm nebenher von einem anderen Thread gefüllt wird,
die Dauer des ganzen dürfte doch weniger eine Rolle spielen,

ich werde das mal testen, falls ich Zeit finde


----------

