jpa - 使用从 EJB 到数据库的流保存 blob(以内存高效的方式)

标签 jpa ejb blob java-ee-6 jboss7.x

我想在数据库中保存大型附件(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/

相关文章:

Spring 数据 jpa 继承-每个类的表不起作用

java - 为什么我无法从查询中获取结果列表?

jakarta-ee - 无状态bean : private field reinitialization

java - 使用 jboss EAP 7 发送 JMS(消息)时出错

database - 存储很长的文本: BLOB or TEXT

mysql - 查询具有逗号分隔值的列

java - Seam 不注入(inject)有状态的 EJB 依赖

jpa - 将 JTA 事务与 EJB 和 JPA 结合使用

azure - SSIS:如何枚举 Azure 存储中的文件并将每个文件加载到 SQL Server 中

c# - 在没有 blob 本身的情况下获取 blob 大小