Blob переменной длины в спящем режиме? - PullRequest
1 голос
/ 19 апреля 2010

У меня есть член byte [] в одном из моих постоянных классов. Обычно я бы просто аннотировал это @Lob и @Column (name = "foo", size =). Однако в этом конкретном случае длина байта [] может сильно варьироваться (от ~ 10 КБ до ~ 100 МБ).

Если я аннотирую столбец размером 128 МБ, я чувствую, что буду тратить много места на мелкие и средние объекты. Можно ли использовать тип BLOB-объектов переменной длины? Будет ли Hibernate позаботиться обо всем этом за кулисами, не теряя места? Какой лучший способ сделать это?

Спасибо!

1 Ответ

3 голосов
/ 19 апреля 2010

Если я аннотирую столбец с размером 128 МБ, я чувствую, что я буду тратить много места для маленьких и объекты среднего размера. Можно ли использовать тип BLOB-объектов переменной длины?

LOB (CLOB или BLOB) не имеют размера (насколько я знаю в большинстве баз данных). Тип предназначен для хранения информации, которая явно больше «обычных» данных. Большая часть базы данных будет использовать другую схему хранения таких данных, например, хранить их в другом сегменте в качестве основных данных таблицы. Я не думаю, что параметр size рассматривается Hibernate.

Будет ли спящий заботиться обо всех это для меня за кадром без тратить пространство?

Hibernate не может многое сделать, и именно база данных будет управлять эффективным хранилищем больших объектов. LOB имеют немного медленнее, чем другие типы (из-за специального хранилища), но они все еще очень хорошо управляются базами данных.

длина байта [] может варьироваться много (от ~ 10KB до ~ 100MB)

Какой лучший способ сделать это?

10 КБ уже велико по сравнению с размером обычных данных в строке (например, цифрой или несколькими символами).

Было бы более проблематично, если бы у вас были, например, строки, которые могут быть короткими (например, 20 символов), но также очень длинными (например, 3000 символов). В этом случае вы заплатите цену большого объекта за маленькие строки (которые могут быть сохранены в основных данных таблицы). Но 10 КБ в любом случае относительно велики, поэтому использование LOB действительно оправдано.

Примечания:

Возможно, вы захотите использовать поток (например, InputStream) вместо байтового массива. Это может повысить производительность вашего приложения, и вы не будете ограничены памятью (что произойдет, если у вас есть 20 одновременно работающих пользователей, которые получают доступ к LOB объемом 100 МБ?).

Вы также можете спросить своего администратора базы данных, как настроить хранилище больших объектов. Большинство баз данных имеют параметры для этого. Вот, например, руководство по производительности Oracle LOB .

...