Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Truncate不会实际释放磁盘空间_Java_Spring_Postgresql_Spring Data_Spring Data Jpa - Fatal编程技术网

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
表的before
truncated
部分会立即被删除

这可能是什么原因


当我使用pgAdmin截断同一个表时,磁盘空间按预期释放。

可能有两个原因

  • PostgresSQL将在真空后删除此索引文件。所以,等待或真空自己

  • 在退出此java程序之前,不会提交SQL


  • 听起来好像您没有正确地提交
    截断
    提交应该由
    @Transactional
    自动处理,也许应该这样做,但根据您的描述,我认为没有。在断开Java应用程序的连接之前,
    pg_stat_activity
    为您的应用程序连接显示了什么?可能spring不知道它需要提交
    truncate
    语句。是否有其他活动事务访问同一个表?如果它们在截断之前就已经开始了,那么直到它们完成,表才会被释放。事实上,它在SQL客户机上运行正常,但在通过模糊层运行语句时却无法正常工作,这意味着该层中存在错误。试着用普通的JDBC运行这个语句。对于2)我可以说:使用pgAdmin,我可以看到一个被截断的空表!所以我假设sql实际上是提交的,否则我不会看到一个空的db?第1点):如果仍在进行任何操作,我是否应该在列表中看到真空pid?我没有看到任何真空过程,我也不认为真空在几天后不会结束(但硬盘中也包含上周的数据库文件,尽管这些数据很久以前就被截断了)…啊,是的。我错了。Truncate将立即删除文件