2012-08-31 13 views
6

He intentado insertar datos BLOB con el desarrollador de SQL. Pero no puedo encontrar las instrucciones de inserción que realmente se utilizan para insertar datos BLOB.¿Cuáles son las formas de insertar y recuperar datos BLOB de la base de datos Oracle utilizando SQL?

Aparte de eso, la velocidad de la base de datos es muy lenta. Para archivos pequeños, se ejecuta bien. Pero cuando traté de importar un archivo avi de 50 mb en BLOB, tardó entre 3 y 4 minutos en & y aún no se completó. Cuando traté de exportar los datos BLOB a un archivo, el proceso de exportación también fue lento. Estaba usando Oracle 10g Express Edition. Si la velocidad de la base de datos es más lenta que la velocidad del sistema de archivos, ¿por qué la base de datos se usa para almacenar datos BLOB? ¿Hay alguna otra forma de optimizar el rendimiento?

+0

Nunca recomendaría el uso de BLOBS para almacenar archivos - sólo ponerlos en un sistema de archivos y almacenar referencias a esos archivos ... –

+0

Me gustaría pensar que 'BLOB's serían casi siempre almacenados en el sistema de archivos y un puntero al directorio de datos se define en 'dba_directories' (como metadatos). Oracle proporciona algunas funciones en su paquete 'webutil' para insertar' BLOB's en una tabla, pero luego estarían en contexto para los usuarios que carguen un archivo (digamos '.avi') a través de una aplicación final (basada en' Oracle Forms' o 'Apex', etc.). La otra forma sería usar 'dbms_lob.fileopen' y' dbms_lob.loadfromfile' para inicializar su var 'BLOB' y luego realizar la inserción, pero nuevamente el rendimiento es una preocupación aquí. – Annjawn

+0

@NWest Si está recomendando almacenar BLOB en el sistema de archivos, ¿por qué cada aplicación web profesional utiliza una base de datos robusta como servicio de fondo? Si alguien almacena la mayor parte de mis datos en el sistema de archivos, ¿por qué alguien necesitará una base de datos? ¡Pueden almacenar información en solo archivos xml o mdb y recuperarlos cuando sea necesario! –

Respuesta

5

Antes de nada, debe esperar almacenar BLOB en una base de datos para ser (a veces un poco, a menudo significativamente) más lento, pero definitivamente no es más rápido que almacenarlos en un sistema de archivos. Las razones para almacenarlos en una base de datos no se centran sobre el rendimiento, pero sobre, por ejemplo:

  • La no disponibilidad de un sistema de archivos (compartido) en una carga equilibrada escenario
  • Facilidad de copia de seguridad agrupado o: Proceso de una sola, aot 2 procesos cuando se usan archivos y base de datos
  • Seguridad de la transacción: Un BLOB está allí y completo o no, pero no en una etapa medio cocida
  • otros No puedo pensar en este momento.

La regla general es que, si ninguno de estos le concierne, debe almacenar sus archivos como ... archivos. Almacenar los metadatos y el nombre de ruta en un DB es en mi opinión una buena práctica común.

Relativo a la optimización de Oracle: Hay libros escritos sobre eso. Sospecho que los totaliza mucho más de una tonelada en formato de árbol muerto en rústica. En primer lugar, puede ver el consumo de memoria del proceso de Oracle: regla de oro: si es inferior a una actuación y usa BLOB, tiene problemas. Lea sobre los diferentes grupos de memoria y cómo aumentarlos. Pueden aplicarse algunos límites para la edición express.

+0

A veces desea poder acceder al mismo archivo (exacto) desde diferentes máquinas en diferentes ubicaciones. Si tiene una base de datos central, podría ser una buena solución (de lo contrario, deberá sincronizar cada archivo con todas las máquinas y resolver posibles problemas de sincronización). – alfasin

+1

+1 "debe almacenar sus archivos como ... archivos" –

+0

@alfasin: Esto es exactamente lo que cubre la primera viñeta: * Falta de disponibilidad de un sistema de archivos (compartido) *. En efecto, reemplazas un sistema de archivos con una base de datos. –

1

Este no es un código que pueda usar con su desarrollador sql, es un código Java que usa un StringBuffer para INSERTAR un blob. Esperamos que sea de utilidad:

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(); 
     } 
    } 
Cuestiones relacionadas