【问题标题】:Variable length Blob in hibernate?休眠中的可变长度Blob?
【发布时间】:2010-04-19 17:13:12
【问题描述】:

我的一个持久类中有一个 byte[] 成员。通常,我只会用@Lob 和@Column(name="foo", size=) 对其进行注释。然而,在这种特殊情况下,byte[] 的长度可以变化很大(从 ~10KB 一直到 ~100MB)。

如果我用 128MB 的大小来注释列,我觉得我会为中小型对象浪费大量空间。我可以使用可变长度的 blob 类型吗? hibernate 会在不浪费空间的情况下在幕后为我处理所有这些吗?解决这个问题的最佳方法是什么?

谢谢!

【问题讨论】:

    标签: java hibernate blob hibernate-annotations variable-length


    【解决方案1】:

    如果我用大小注释列 128MB,我觉得我会浪费 有很多空间供小而 中等大小的物体。我可以使用可变长度的 blob 类型吗?

    LOB(CLOB 或 BLOB)没有大小(据我所知,在大多数数据库中)。该类型旨在保存明显大于“常规”数据的信息。大多数数据库将使用不同的存储方案来存储此类数据,例如将它们存储在另一个段中作为表的主要数据。我认为 Hibernate 不考虑 size 参数。

    冬眠会照顾所有 这对我来说在幕后没有 浪费空间?

    Hibernate 不能做太多事情,它是管理 LOB 有效存储的数据库。 LOB has 比其他类型慢一点(因为特殊的存储),但它们仍然很好地由数据库管理。

    byte[] 的长度可以变化 很多(从~10KB一直到 ~100MB)

    最好的方法是什么?

    与一行中的常规数据(例如,一个数字或几个字符)的大小相比,10KB 已经很大了。

    如果您的字符串可以很短(例如 20 个字符),但也可以很长(例如 3000 个字符),那么问题会更大。在这种情况下,您将为小字符串(可以存储在表的主数据中)支付 LOB 的价格。但是 10KB 还是比较大的,所以使用 LOB 确实是合理的。

    注意事项:

    您可以考虑使用流(例如InputStream)而不是字节数组。这可能会提高您的应用程序的性能,并且您不会受到内存的限制(当您有 20 个访问 100MB LOB 的并发用户时会发生什么?)。

    您也可以考虑询问您的 DBA 如何调整 LOB 存储。大多数数据库都有这个参数。例如,这里是 Oracle LOB Performance Guideline

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多