我想在数据库中保存大型附件(500Mb,如果可能,甚至 > 2Gb)。我知道经常讨论这样做的利弊,但这不是我的问题的重点。
使用 JPA 在 EJB3 中存储 Blob 字段的常规方法是使用如下代码:
@Lob
private byte[] data;
这在处理大量数据源时会成为一个问题,因为整个字节数组都保存在内存中。
我尝试将其更改为 Blob:
@Lob
private Blob data;
但这会导致同样的问题。打电话时
// 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);
createBlob 方法从 inputStream 创建一个 byteArray。
因为ORM映射,我也想知道数据的插入是怎么处理的。
一个想法是创建一个实体变量
@Lob
private byte[] data;
我永远不会使用的。这样,数据库模式就得到了构建。但是因为@Lob 注释是懒惰的,所以它不会膨胀我的内存。
然后写
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);
我偶然发现的一种解决方案看起来不错,但不使用 JPA:
Grooviest way to store a BLOB in a database?
有没有人有关于如何做到这一点的建议?
最佳答案
@Lob 注释可以应用于 Serializable 对象。
然后你可以声明:
@Lob
private MySmartLOB data;
和
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
}
}
这可能会起作用,希望底层 JPA 实现足够智能,可以提供直接通过管道传输到 JDBC 流的 ObjectOutputStream,而不是某种丑陋的 ByteArrayOutputStream。
关于jpa - 使用从 EJB 到数据库的流保存 blob(以内存高效的方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898739/