1

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

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

谢谢!

4

1 回答 1

3

如果我用 128MB 的大小来注释列,我觉得我会为中小型对象浪费大量空间。我可以使用可变长度的 blob 类型吗?

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

hibernate 会在不浪费空间的情况下在幕后为我处理所有这些吗?

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

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

解决这个问题的最佳方法是什么?

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

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

笔记:

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

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

于 2010-04-19T17:21:37.760 回答