休眠中的可变长度Blob?

时间:2010-04-19 17:13:13

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

我的一个持久化类中有一个byte []成员。通常,我只是用@Lob和@Column(name =“foo”,size =)来注释它。但是,在这种特殊情况下,byte []的长度可以变化很大(从大约10KB到大约100MB)。

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

谢谢!

1 个答案:

答案 0 :(得分:3)

  

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

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

  

hibernate会照顾好所有   这对我在幕后没有   浪费空间?

Hibernate做不了多少,它是管理LOB高效存储的数据库。 LOB比其他类型有点慢(因为特殊存储),但它们仍然可以很好地管理数据库。

  

字节[]的长度可以变化a   很多(从大约10KB到最多   〜100MB)

     

最好的方法是什么?

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

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

注意:

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

您可能还会考虑询问您的DBA如何调整LOB存储。大多数数据库都有此参数。例如,Oracle LOB Performance Guideline