Как отобразить LOB в Hibernate и Postgresql, чтобы очистить неиспользуемое пространство
Если у вас есть тип Лоб
@Column(name = "xml")
@Lob
private String xml;
затем в PostgreSQL вы получите столбец с текстом типа
\d tablename
Column | Type | Modifiers
----------------+-----------------------------+-----------
xml | text |
Когда вы вставляете некоторый текст в этот столбец, тогда создается большой объект, и столбец содержит ссылку на этот объект.
# select * from tablename
xml
+------------
242781
(1 row)
В этом посте предлагается использовать утилиту вакуума для очистки больших объектов, которые соответствуют удаленным строкам. Но согласно этой документации
Затем он просматривает все столбцы в базе данных, имеющие тип oid или lo, и удаляет совпадающие записи из временной таблицы. (Примечание: рассматриваются только типы с этими именами; в частности, домены над ними не рассматриваются.)
Таким образом, если вы запустите вакуум на базе данных, содержащей текстовый столбец, все большие объекты будут удалены, так как они являются ссылками из текстового столбца, а не oid. Так что вопрос, как я должен сопоставить объект LOB в спящем режиме, чтобы разрешить очистить неиспользуемое пространство
Я проверил с Postgresql 9.3.4 и Hibernate 4.3.5