2013-12-16 6 views
6

C'è un modo per leggere e scrivere da un blob in blocchi usando Hibernate. In questo momento sto ricevendo OutOfmemoryException perché l'intero blob dati viene caricato in memoria in un byte[].Lettura/scrittura di dati BLOB in blocchi con Hibernate

Per essere più specifici, supponiamo di voler salvare un file di grandi dimensioni in una tabella di database denominata File.

public class File { 
    private byte[] data; 
} 

Apro il file in un FileInputStream e poi? Come si comunica a Hibernate che è necessario eseguire lo streaming del contenuto e non fornire l'intero array byte[] in una sola volta? Devo usare Blob invece di byte[]? In ogni caso, come posso trasmettere il contenuto in streaming?

Per quanto riguarda la lettura, c'è un modo posso dire che vanno in letargo (oltre il lazy loading lo fa) ho bisogno del blob da caricare in blocchi, in modo da quando posso recuperare il mio File non dovrebbe darmi OutOfMemoryException.

sto usando:

  • Oracle 11.2.0.3.0
  • Hibernate 4.2.3 finale
  • driver Oracle 11,2

risposta

11

Se andare via Macchia, Hai provato a usare Il metodo di Hibernate LobHelpercreateBlob, che prende uno InputStream? Per creare un BLOB e persistere nel database, devi fornire l'oggetto FileInputStream e il numero di byte.

file di classe bean/entità potrebbe mappare il Blob in questo modo (usando le annotazioni JPA):

@Lob 
@Column(name = "DATA") 
private Blob data; 

// Getter and setter 

E la classe di accesso logica di business/dati potrebbe creare il Blob per l'oggetto bean/entità come questo, facendo attenzione a non chiudere il flusso di ingresso prima di persistenti al database:

FileInputStream fis = new FileInputStream(file); 
Blob data = getSession().getLobHelper().createBlob(fis, file.length()); 
fileEntity.setData(data); 
// Persist file entity object to database 

per andare nella direzione opposta e leggere il Blob dal database come un flusso in blocchi, si può chiamare il metodo del Blob getBinaryStream, dandovi la InputStream e che consente di impostare la dimensione del buffer in un secondo momento, se necessario:

InputStream is = fileEntity.getData().getBinaryStream(); 

Struts 2 has a convenient configuration available that can set the InputStream result's buffer size.

+0

Come posso definire @Lob in hbm.xml (definiamo i nostri oggetti di dominio nei file hbm.xml)? – Atticus

+0

Credo che l'annotazione @Lob sia facoltativa fintanto che si specifica type = "blob" –

+1

Chi chiude il flusso? –