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?
¿Hay alguna razón para que use un blob en lugar de una ruta de archivo? – siebz0r
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. –
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