我想在数据库中保存大附件(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?
有人建议如何做到这一点吗?
答案 0 :(得分:1)
@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 。