2012-08-31 19 views
6

Ho provato a inserire dati BLOB con lo sviluppatore SQL. Ma non riesco a trovare le istruzioni di inserimento che vengono effettivamente utilizzate per inserire i dati BLOB.Quali sono i modi per inserire e recuperare i dati BLOB dal database Oracle utilizzando SQL?

A parte questo, la velocità di base di dati è molto lento. Per i file di piccole dimensioni, viene eseguito correttamente. Ma quando ho provato a importare il file avi da 50 mb in BLOB, ci sono voluti 3-4 minuti & ma non è stato completato. Quando ho provato ad esportare i dati BLOB in un file, anche il processo di esportazione era lento. Stavo usando Oracle 10g Express Edition. Se la velocità del database è inferiore a quella della velocità del file system, perché vengono utilizzati i database per archiviare i dati BLOB? C'è un altro modo per ottimizzare le prestazioni?

+0

ho mai raccomandare l'utilizzo di BLOB per archiviare i file - basta metterli su un filesystem e memorizzare i riferimenti a quei file ... –

+0

Vorrei pensare che 'BLOB's sarebbero quasi sempre memorizzati nel file system e un puntatore alla directory dei dati è definito in 'dba_directories' (come i metadati). Oracle fornisce alcune funzioni nella sua 'pacchetto webutil' inserire' BLOB's in una tabella, ma poi quelli sarebbe in un contesto per gli utenti il ​​caricamento di un file (detto '.avi') tramite un dall'estremità applicazione (sulla base di' Oracle forms' o 'Apice' ecc.). L'altro modo sarebbe usare 'dbms_lob.fileopen' e' dbms_lob.loadfromfile' per inizializzare la variabile 'BLOB' e poi eseguire l'inserimento, ma anche qui le prestazioni sono un problema. – Annjawn

+0

@NWest Se si consiglia di archiviare BLOB in file system, allora perché ogni applicazione Web professionale utilizza un database affidabile come servizio di back-end? Se qualcuno memorizza una parte importante dei miei dati nel file system, allora perché qualcuno avrà bisogno di un database? Possono memorizzare informazioni solo in file xml o mdb e recuperarli quando richiesto !!!! –

risposta

5

Prima di tutto, si dovrebbe aspettarsi memorizzazione BLOB in un database per essere (a volte un po ', spesso molto) più lento, ma sicuramente non più velocemente di quanto la loro memorizzazione in un file system. Le ragioni per memorizzarli in un DB non centrare sulle prestazioni, ma di esempio:

  • Indisponibilità di un file (comune) del sistema in un carico bilanciato scenario
  • Facilità di backup di cluster o: processo singolo, AOT 2 processi quando vengono utilizzati i file e DB
  • Sicurezza delle transazioni: Un BLOB è lì e completo oppure no, ma non in una fase semicotta
  • altri a cui non riesco a pensare in questo momento.

La regola generale è che, se nessuno di questi ti riguarda, è necessario archiviare i file come ... file. Memorizzare i metadati e il pathname in un DB è una buona pratica di IMHO.

Per quanto riguarda la sintonizzazione Oracle: Ci sono libri scritti su questo. Ho il sospetto di totalizzarli di gran lunga più di una tonnellata in formato tascabile con albero morto. Prima di tutto puoi considerare il consumo di memoria del processo Oracle: regola generale: se è inferiore a un concerto e usi BLOB, sei nei guai. Leggi i diversi pool di memoria e come aumentarli. Potrebbero essere applicati alcuni limiti per l'edizione espressa.

+0

A volte si desidera poter accedere allo stesso file (esatto) da macchine diverse in posizioni diverse. Se hai un DB centrale potrebbe essere una buona soluzione (altrimenti dovrai sincronizzare ogni file con tutte le macchine e gestire eventuali problemi di sincronizzazione). – alfasin

+1

+1 "è necessario memorizzare i file come ... file" –

+0

@alfasin: questo è esattamente ciò che copre il primo punto elenco: * Indisponibilità di un file system (condiviso) *. In effetti si sostituisce un file system con un database. –

1

Questo non è un codice è possibile utilizzare con lo sql-sviluppatore, è il codice Java che utilizza uno StringBuffer per inserire un blob. Spero che sarà utile:

private void addBlob(oracle.jdbc.OracleConnection oracleConn, StringBuffer content) throws Exception 
{  
     PreparedStatement st = null; 
     try {     
      oracle.sql.BLOB blob = oracle.sql.BLOB.createTemporary(oracleConn, true, oracle.sql.BLOB.DURATION_SESSION); 

      blob.setBytes(1, content.toString().getBytes("UTF-8")); 

      st = oracleConn.prepareStatement("INSERT INTO MYTABLE (id, content) VALUES (MYTABLE_S.NEXTVAL, ?)"); 
      st.setBlob(1, blob); 
      st.execute(); 
      st.close(); 
     } 
     catch (Exception e) { 
      utils.writeLog("Blob insertion Failed", e, utils.ERR); 
      throw e; 
     }   
     finally{ 
      st.close(); 
     } 
    } 
Problemi correlati