【发布时间】:2026-02-18 01:10:01
【问题描述】:
我使用spring-data 和CrudRepository 进行任何数据库访问。每天一次,我还必须截断包含大约 100GB 数据的缓存表并重建它。
问题:表被成功截断(我验证表是空的),但是文件没有从数据库的硬盘中物理删除!
interface MyTableRepository extends CrudRepository<MyTableEntity, Long> {
@Query(value = "TRUNCATE TABLE my_table", nativeQuery = true)
@Modifying
@Transactional
void truncateTable();
}
因此,硬盘空间日益减少。
我注意到:如果我关闭我的 java 应用程序,那么 truncated 表之前的 truncated 部分会立即被删除!
这可能是什么原因?
当我使用 pgAdmin 截断同一张表时,磁盘空间按预期释放。
【问题讨论】:
-
听起来好像您没有正确提交
truncate -
提交应该由
@Transactional自动处理 -
也许它应该,但从你的描述我会说它没有。在您断开 Java 应用程序之前,
pg_stat_activity为您的应用程序连接显示了什么?也许 spring 不知道它需要提交truncate声明。 -
是否有其他活动事务访问同一个表?如果它们在截断之前已经开始,那么在它们完成之前,不会释放该表。
-
事实上,它在您的 SQL 客户端上运行良好,但在您通过混淆层运行语句时却不行,这意味着该层中的某些东西是错误的。尝试使用普通 JDBC 运行语句。
标签: java spring postgresql spring-data spring-data-jpa