我的JPA实体:
@Entity
public class Test implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Lob
public byte[] data;
}
现在,假设我在数据库中存储了100个条目,每个条目包含3 MB。
SELECT x FROM Test x
返回100个条目,数据库(在文件系统上)的大小约为300 MB(正如预期的那样)。
下一步是通过为每个条目调用entityManager.remove(test)
来删除所有100个条目。
SELECT x FROM Test x
现在导致一个空表,但数据库的大小仍然是300 MB!首先,如果我删除表,数据库将缩小到初始状态。
这里出了什么问题?如果删除条目,它们将不会被删除?!
我尝试使用JavaDB和Oracle XE,而我使用的是EclipseLink。
答案 0 :(得分:0)
对我来说,我将看到JPA事务是否已成功提交,并从数据库控制台中选择实体计数以进行双重检查。
如果表记录没有真正消失,则意味着您可能在删除记录时遇到一些问题。尝试提交trasnaction或刷新它。
如果表记录已经消失但数据库磁盘空间仍然存在,则意味着它可能是数据库空间关联管理策略的becoz,然后检查数据库配置,了解一旦记录消失后如何释放空间。
答案 1 :(得分:0)
数据库不会物理删除数据(显然)。何时以及如何完成取决于数据库及其设置,例如它可以由某些文件大小阈值,手动压缩命令或预定维护任务触发。这完全独立于JPA。