如何在Hibernate和Postgresql中映射LOB以清理未使用的空间
如果您有lob类型如何在Hibernate和Postgresql中映射LOB以清理未使用的空间,hibernate,postgresql,lob,Hibernate,Postgresql,Lob,如果您有lob类型 @Column(name = "xml") @Lob private String xml; 然后在PostgreSQL中,您将得到类型为text的列 \d tablename Column | Type | Modifiers ----------------+-----------------------------+----------- xml | text
@Column(name = "xml")
@Lob
private String xml;
然后在PostgreSQL中,您将得到类型为text的列
\d tablename
Column | Type | Modifiers
----------------+-----------------------------+-----------
xml | text |
在该列中插入一些文本时,将创建一个大对象,该列包含指向该对象的链接
# select * from tablename
xml
+------------
242781
(1 row)
在本文中,建议使用vacuumlo实用程序来清理与已删除行相对应的大型对象。但是根据这个
然后它扫描数据库中oid类型的所有列
或lo,并从临时表中删除匹配项。(注:
仅考虑具有这些名称的类型;尤其是域
不考虑超过它们。)
所以,若您在包含文本列的数据库上运行vacuumlo,那个么所有大型对象都将被删除,因为它们是从文本列而非oid引用的。
所以,问题是我应该如何在hibernate中映射LOB对象,以允许清理未使用的空间
我用PostgreSQL 93.4和Hibernate 4.3.5
检查,当您使用<代码> @ Lob < /Cord>注释时,使用“大对象”,如果我没有错的话(我认为这是一个bug,它应该使用<代码> BTEA < /COD>)。无论如何,在大多数情况下,使用“大型对象”是错误的选择。如果要在该列中存储XML,为什么不使用XML
类型?或者至少让Hibernate使用bytea
而不是oid
这里有一个解决方法,可以存储值,而不是在postgres中使用大型对象。