Il modo migliore per caricare il blob pigro dal database in Java?

2

Ho una tabella di database che memorizza i file caricati (file excel) in un campo blob. Ogni record contiene l'uploader, il tempo di caricamento, l'ID di caricamento (chiave primaria) e, naturalmente, il blob stesso.

A un certo punto, ho bisogno di ottenere che i dati dal database facciano qualcosa con esso. Attualmente, ho un POJO che rispecchia solo la struttura della tabella e memorizza il file in un array di byte, cioè;

class Upload {
    private String ID;
    private ByteArray[] data;
    //Other fields and methods ommited for brevity
}

Come sono sicuro che sarete d'accordo, questo lascia l'applicazione aperta ai problemi di memoria se il file è particolarmente grande. In realtà, è improbabile che questo file diventi così grande da causare un problema, ma sicuramente questo non può essere considerato un buon progetto.

Ho cercato di scoprire quali sono le migliori pratiche per i dati di blob a caricamento lento, ma ho difficoltà a trovare materiale che non riguardi l'uso di particolari framework di applicazione.

Penso che ho bisogno di perdere il campo "dati" e ho solo un metodo, es. getData (), che avvia una nuova transazione DB per recuperare il blob restituisce un InputStream ad esso? Vedi sotto per esempio, per favore fammi sapere se c'è un modo migliore per farlo ..

public InputStream getData(){
    //Construct and execute SQL query.
    Blob blob = rs.getBlob(1);
    return blob.getBinaryStream();
} 
    
posta goodsquishy 28.03.2013 - 10:41
fonte

1 risposta

2

l'altra cosa che puoi fare è memorizzare il valore nella cache dopo il primo caricamento, quindi non è necessario tornare al database

public InputStream getData(){
    if(data==null){
        //Construct and execute SQL query.
        Blob blob = rs.getBlob(1);
        data = blob.getBinaryStream();
    }
    return data;
} 

se ti aspetti che questi blob siano molto grandi e vuoi essere in grado di recuperare spazio mantenendo il record stesso in memoria puoi usare un WeakReference per il blob

private WeakReference<ByteArray[]> data;

public InputStream getData(){
    ByteArray[] local = data!=null?data.get():null;
    if(local==null){
        //Construct and execute SQL query.
        Blob blob = rs.getBlob(1);
        local = blob.getBinaryStream();
        data = new WeakReference<ByteArray[]>(local);
    }
    return local;
} 
    
risposta data 28.03.2013 - 11:28
fonte

Leggi altre domande sui tag