2012-03-27 13 views
7

Quiero guardar archivos adjuntos grandes (500Mb, tal vez, si es posible, incluso> 2Gb) en una base de datos. Sé que los pros y los contras de hacerlo se discuten con mucha frecuencia, pero ese no es el enfoque de mi pregunta.Guardar blob utilizando una secuencia de EJB a la base de datos (de manera eficiente con la memoria)

La forma convencional de almacenar campos Blob en EJB3 con JPA es el uso de un código de la siguiente manera:

@Lob 
private byte[] data; 

esto se convierte en un problema cuando el manejo de enormes fuentes de datos, ya que todo el conjunto de bytes se guarda en la memoria.

traté de cambiarlo a Blob:

@Lob 
private Blob data; 

Pero esto resulta en el mismo problema. Al llamar al

// session: Hibernate session. 
// Actually, I'd like to stay with JPA's abstraction and not 
// reference Hibernate directly, if possible 
Blob data = session.createBlob(inputStream, lengthOfStream); 

el método createBlob crea un byteArray del inputStream.

Debido a la asignación de ORM, también me pregunto cómo manejar la inserción de los datos. Una idea era hacer una variable entidad

@Lob 
private byte[] data; 

que nunca voy a usar. De esta forma, se construye el esquema de la base de datos. Pero debido a que la anotación @Lob es floja, no hinchará mi memoria.

y luego escribir

entityManager.persist(dataObject); 
// The following lines are _completely_ imaginatory!! 
query.prepare("update DataObject d set d.data = :dataInputStream where d = :dataObject"); 
query.setProperty("dataObject", dataObject); 
query.setProperty("dataInputStream", someDataInputStream); 

Una solución me encontré con ve bien, pero no utiliza JPA: Grooviest way to store a BLOB in a database?

¿Alguien tiene un consejo sobre cómo hacer esto?

+0

¿Hay alguna razón para que use un blob en lugar de una ruta de archivo? – siebz0r

+0

Sí, portabilidad. La idea es almacenar los datos en la base de datos y almacenarlos en caché en el sistema de archivos. De esta forma, solo el DB y el jar deben copiarse a un nuevo sistema: los archivos se guardarán en caché desde el DB hasta el sistema de archivos automáticamente. –

+0

No creo que esta sea una forma eficiente de almacenamiento. Si la ruta de almacenamiento es configurable, la ruta en la base de datos solo necesita ser un postfijo de la ruta inicial. La desventaja es que necesita mover el db, jar y archivos. Pero creo que los pros superan a los contras aquí. – siebz0r

Respuesta

1

@Lob la anotación se puede aplicar a un objeto Serializable. A continuación, podría declarar:

@Lob 
private MySmartLOB data; 

y

public class MySmartLOB implements Serializable { 
    private void writeObject(java.io.ObjectOutputStream out) 
      throws IOException { 
     // tranfer data from local storage to 'out' 
    } 
    private void readObject(java.io.ObjectInputStream in) 
      throws IOException, ClassNotFoundException { 
     // tranfer data from 'in' to local storage 
    } 
} 

Esto podría funcionar, espera que la implementación de JPA subyacente es lo suficientemente inteligente como para suministrar un ObjectOutputStream directamente por tubería a la corriente JDBC y no algún tipo de feo ByteArrayOutputStream.

Cuestiones relacionadas