【问题标题】:Postgresql 8.4 reading OID style BLOBs with HibernatePostgresql 8.4 使用 Hibernate 读取 OID 样式的 BLOB
【发布时间】:2010-06-11 18:36:06
【问题描述】:

在使用 Hibernate 查询 Postgres 8.4 以获取带有 Blob(OID 类型)的一些记录时,我遇到了这种奇怪的情况。查询确实可以返回,但是当我的代码想要使用下面的简单代码读取 BLOB 的内容时,它会返回 0 个字节

public static byte[] readBlob(Blob blob) throws Exception {
    InputStream is = null;
    try {
        is = blob.getBinaryStream();
        return org.apache.commons.io.IOUtils.toByteArray(is);
    }
    finally {
        if (is != null)
            try {
                is.close();
            }
            catch(Exception e) {}
    }
}

有趣的是,我之所以会出现这种行为,是因为我已经开始向表中添加多个这样的记录。 底层 JDBC 库是类型 3 (postgresq 8.4-701)。 有人可以给我一个关于如何解决这个问题的提示吗? 谢谢

彼得

【问题讨论】:

  • 如果你得到 6 个字节,那么我会说你正在读取 OID,0 个字节可能意味着 OID 为空或 blobdata 实际上只有 0 个字节长。尝试休眠 3.6 顺便说一句。

标签: java hibernate postgresql


【解决方案1】:

看起来您可能已经发现了这个错误: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876

【讨论】:

    【解决方案2】:

    我已经有一段时间没有遇到类似的问题了,因为我对这个话题有了新的记忆,所以我正在考虑分享结果。问题是 Postgres(以及 Oracle 的几个版本)不会在同一事务中的记录创建时间处理 Blob 内容。有趣的想法是,需要在外部文件(最终存储内容的地方)被很好地创建并为操作保留之后传递内容。是的,记录已创建,但 Blob 为空白。要让 Blob 填写您需要输入的任何内容,您需要在第二个事务中执行该操作(类似于更新记录)。这是一个有趣的事情(可能是一个重大错误),呵呵

    【讨论】:

    • PostgreSQL 绝对支持在主事务中处理 blob。这就是在数据库中使用 blob 的全部原因。不过我不知道 Hibernate...
    • 我已经调试到 JDBC 客户端级别进行了哪些调用。在我看来,在某些情况下,当要存储的内容受到限制时,与 Blob 的交易会在拍摄时顺利进行。但是超过一定的门槛,交易就不会进行。它可能与我还不知道的 Postgres 配置设置有关。但是感谢您的 cmets
    猜你喜欢
    • 2017-08-14
    • 2014-01-04
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2011-05-28
    • 2023-03-09
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多