【问题标题】:mapping byte[] in Hibernate and adding file chunk by chunk在 Hibernate 中映射 byte[] 并逐块添加文件
【发布时间】:2011-05-13 13:29:15
【问题描述】:

我有一个按块接收 100 Mb 视频文件的网络服务

public void addFileChunk(Long fileId, byte[] buffer)

如何使用 hibernate 将此文件存储在 Postgresql 数据库中?

使用常规 JDBC 非常简单。我会在我的网络服务方法中使用以下代码:

 LargeObject largeObject = largeObjectManager.Open(fileId, LargeObjectManager.READWRITE);
                    int size = largeObject.Size();
                    largeObject.Seek(size);
                    largeObject.Write(buffer);
                    largeObject.Close();

如何使用 Hibernate 实现相同的功能?并按块存储这个文件?

在我看来,将每个文件块作为 bytea 存储在单独的行中似乎不是那么聪明的主意。皮斯建议。

【问题讨论】:

  • 你为什么不直接绕过 Hibernate 呢?
  • 因为这是 Spring 集成的 Web 服务,我已经注入了 Hibernate 和事务管理 bean,并在其他方法中广泛使用。所以我不想只为存储这个文件而打开新的 JDBC 连接。

标签: java hibernate postgresql jdbc jakarta-ee


【解决方案1】:

现在建议在数据库中存储 100MB 的文件。我会将它们存储在文件系统中,但考虑到事务处于活动状态,使用 Servlet 似乎是合理的。

  1. 处理 http 请求,以便将文件(接收到的)存储在某个临时位置。
  2. 打开事务,持久化文件元数据,包括时间位置,关闭事务
  3. 使用一些将监视临时文件的外部进程,将此文件传输到其最终目的地,用户可以通过某些 Servlet 使用该目的地。

【讨论】:

  • 我不知道为什么不建议将它们作为大对象存储在 PostgreSQL 中。 LOB 接口为您提供了类似文件系统的流接口,因此您可以根据需要对输入或输出进行分块。它运行良好,如果需要,您甚至可以创建索引来索引重要数据的偏移量。
【解决方案2】:

见http://in.relation.to/Bloggers/PostgreSQLAndBLOBs

是的,bytea 会很糟糕。 Hibernate 有一种方法可以继续使用大对象,并且您可以保留流式接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多