Java Truncate不会实际释放磁盘空间
我将Java Truncate不会实际释放磁盘空间,java,spring,postgresql,spring-data,spring-data-jpa,Java,Spring,Postgresql,Spring Data,Spring Data Jpa,我将spring数据与crudepository一起用于任何数据库访问。每天一次,我还必须截断一个缓存了大约100GB数据的表并重建它 问题:表已成功截断(我已验证表为空),但该文件未从数据库的硬盘中物理删除 interface MyTableRepository extends CrudRepository<MyTableEntity, Long> { @Query(value = "TRUNCATE TABLE my_table", nativeQuery = true)
spring数据
与crudepository
一起用于任何数据库访问。每天一次,我还必须截断一个缓存了大约100GB数据的表并重建它
问题:表已成功截断(我已验证表为空),但该文件未从数据库的硬盘中物理删除
interface MyTableRepository extends CrudRepository<MyTableEntity, Long> {
@Query(value = "TRUNCATE TABLE my_table", nativeQuery = true)
@Modifying
@Transactional
void truncateTable();
}
接口MyTableRepository扩展了Crudepository{
@查询(value=“TRUNCATE TABLE my_TABLE”,nativeQuery=true)
@修改
@交易的
void truncatable();
}
因此,硬盘空间一天比一天小。
我注意到:如果我关闭我的java应用程序,那么postgres
表的beforetruncated
部分会立即被删除
这可能是什么原因
当我使用pgAdmin截断同一个表时,磁盘空间按预期释放。可能有两个原因
听起来好像您没有正确地提交
截断
提交应该由@Transactional
自动处理,也许应该这样做,但根据您的描述,我认为没有。在断开Java应用程序的连接之前,pg_stat_activity
为您的应用程序连接显示了什么?可能spring不知道它需要提交truncate
语句。是否有其他活动事务访问同一个表?如果它们在截断之前就已经开始了,那么直到它们完成,表才会被释放。事实上,它在SQL客户机上运行正常,但在通过模糊层运行语句时却无法正常工作,这意味着该层中存在错误。试着用普通的JDBC运行这个语句。对于2)我可以说:使用pgAdmin,我可以看到一个被截断的空表!所以我假设sql实际上是提交的,否则我不会看到一个空的db?第1点):如果仍在进行任何操作,我是否应该在列表中看到真空pid?我没有看到任何真空过程,我也不认为真空在几天后不会结束(但硬盘中也包含上周的数据库文件,尽管这些数据很久以前就被截断了)…啊,是的。我错了。Truncate将立即删除文件