Lesen/schreiben von blob-Daten in Blöcken mit Hibernate
Gibt es eine Möglichkeit zum Lesen und schreiben von einem blob
in Blöcken mit Hibernate
.
Jetzt bin ich immer OutOfmemoryException
weil das ganze blob-Daten in den Speicher geladen wird in ein byte[]
.
Um genauer zu sein, sagen wir, ich will eine große Datei speichern, in eine Datenbank-Tabelle namens File
.
public class File {
private byte[] data;
}
Öffne ich die Datei in einen FileInputStream und was dann?
Wie kann ich feststellen, Hibernate, dass ich brauchen, um Strom, den Inhalt und geben nicht die ganze byte[]
array auf einmal?
Sollte ich Blob
statt byte[]
? Eh wie kann ich das streamen von Inhalten?
In Bezug auf Lesen, gibt es eine Möglichkeit, ich kann sagen, hibernate, dass (neben dem lazy loading es tut), dann Brauch ich das blob geladen werden, in Blöcken, so dass, wenn ich wieder an meine File
sollte es mir nicht OutOfMemoryException
.
Ich bin mit:
- Oracle 11.2.0.3.0
- Hibernate 4.2.3 Abschließende
- Oracle-Treiber 11.2
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn man die Blob-route, haben Sie versucht, mit Hilfe von Hibernate ist
LobHelper
createBlob Methode, die dauert eineInputStream
? Zum erstellen einer Blob, und bestehen auf die Datenbank, die Sie liefern würden, die FileInputStream-Objekt und die Anzahl der bytes.Ihre Datei bean/entity-Klasse könnte Karte die Blob -, wie Sie dieses (mithilfe von JPA-Annotationen):
Und die business-Logik/Daten-Zugriff-Klasse schaffen könnte den Blob für Ihre bean/entity-Objekt wie diese, kümmert sich nicht um schließen Sie die input-stream vor dem fortbestehen der Datenbank:
In die andere Richtung gehen und Lesen das Blob aus der Datenbank als stream in chunks zu nennen, könnten Sie den Blob - getBinaryStream Methode, geben Sie den InputStream und in dem Sie die Puffer-Größe bei Bedarf später:
Struts 2 hat eine bequeme Konfiguration zur Verfügung, die den InputStream Ergebnis der buffer-Größe.
true
(direkt nach dem einfügen ist möglich).Aber ist es wahrscheinlich eine gute Praxis, um den stream schließen sich nach der session geleert wird/Transaktion abgeschlossen ist, da es nicht im Vertrag festgelegt, für dieLobHelper
- Schnittstelle.