2012-08-31 21 views
6

Próbowałem wstawić dane BLOB z programistą SQL. Ale nie mogę znaleźć instrukcji insertowych, które są używane do wstawiania danych BLOB.Jakie są sposoby wstawiania i pobierania danych BLOB z bazy danych Oracle przy użyciu języka SQL?

Poza tym prędkość bazy danych jest bardzo wolna. W przypadku małych plików działa poprawnie. Ale kiedy próbowałem zaimportować plik 50 avi na BLOB, zajęło to 3-4 minuty & nadal nie zostało ukończone. Kiedy próbowałem wyeksportować dane BLOB do pliku, proces eksportu był również powolny. Używałem Oracle Express Express 10g. Jeśli prędkość bazy danych jest mniejsza niż prędkość systemu plików, to dlaczego baza danych jest używana do przechowywania danych BLOB? Czy jest jakiś inny sposób na zoptymalizowanie wydajności?

+0

Nigdy nie polecam korzystania Blobs do przechowywania plików - wystarczy umieścić je na systemie plików i przechowywać odniesienia do tych plików ... –

+0

Chciałbym myśleć, że 'BLOB's będzie prawie zawsze przechowywany w systemie plików i wskaźnik do katalogu danych jest zdefiniowany w 'dba_directories' (jak metadane). Oracle udostępnia niektóre funkcje w pakiecie 'webutil', aby wstawić' BLOB's do tabeli, ale wtedy będzie to w kontekście użytkowników, którzy ładują plik (powiedzmy '.avi') za pośrednictwem aplikacji od użytkownika (w oparciu o' Oracle Forms' lub 'Apex' itp.). Innym sposobem byłoby użycie 'dbms_lob.fileopen' &' dbms_lob.loadfromfile' w celu zainicjowania twojego pliku 'BLOB', a następnie wykonania wstawki, ale tutaj znowu problemem jest wydajność. – Annjawn

+0

@NWest Jeśli zalecane jest przechowywanie obiektów BLOB w systemie plików, dlaczego każda profesjonalna aplikacja internetowa korzysta z niezawodnej bazy danych jako usługi zaplecza? Jeśli ktokolwiek przechowuje większą część moich danych w systemie plików, to dlaczego w ogóle ktoś potrzebuje bazy danych? Mogą przechowywać informacje w pliku xml lub mdb i odzyskać je w razie potrzeby !!!! –

Odpowiedz

5

Przede wszystkim należy oczekiwać przechowywania BLOB w bazie danych, aby być (czasami nieco, często znacznie) wolniejsze, ale zdecydowanie nie szybciej niż przechowywanie ich w systemie plików. Powody do ich przechowywania w DB nie wyśrodkować o wydajność, ale o np

  • niedostępności (shared) systemu plików w klastrowym lub równoważeniem obciążenia scenariusz
  • Łatwość tworzenia kopii zapasowych: pojedynczy proces, aot 2 procesy, gdy pliki i DB są używane
  • Bezpieczeństwo transakcji: BLOB jest tam i jest kompletny lub nie, ale nie na wpół wypalonym etapie.
  • inne Nie mogę teraz myśleć.

Ogólna zasada jest taka, że ​​jeśli żadna z nich nie dotyczy użytkownika, należy przechowywać pliki jako ... pliki. Przechowywanie metadanych i ścieżek w DB jest dobrą i powszechną praktyką IMHO.

Dotyczące strojenia Oracle: Są na ten temat napisane książki. Podejrzewam, że łączę je znacznie ponad tonę w formacie martwego drzewa-broszury. Przede wszystkim możesz przyjrzeć się procesowi pamięci Oracle - zasada kciuka: jeśli jest to mniej niż gig i używasz BLOB-ów, masz kłopoty. Czytaj na temat różnych pul pamięci i jak je zwiększać. Mogą obowiązywać pewne ograniczenia dotyczące edycji ekspresowej.

+0

Czasami chcesz mieć dostęp do (dokładnego) tego samego pliku z różnych maszyn w różnych lokalizacjach. Jeśli masz jedną centralną bazę danych, może to być dobre rozwiązanie (w przeciwnym razie będziesz musiał zsynchronizować każdy plik z wszystkimi komputerami i rozwiązać ewentualne problemy z synchronizacją). – alfasin

+1

+1 "powinieneś przechowywać swoje pliki jako ... pliki" –

+0

@alfasin: Dokładnie to, co obejmuje pierwszy punkt: * Niedostępność (współdzielonego) systemu plików *. W efekcie zastępujesz system plików bazą danych. –

1

To nie jest kod, którego można używać z deweloperem sql, jest to kod Java, który używa StringBuffer w celu INSERT blob. Nadzieję, że to będzie przydatne:

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(); 
     } 
    } 
Powiązane problemy