H2文件型数据库删除DB文件后仍可读写?技术咨询
问题
本地运行基于H2文件型数据库的Spring Boot服务,启动时会正常生成DB文件,且可通过H2控制台查询数据库。其application.properties配置如下:
spring.datasource.url=jdbc:h2:file:~/.AppData/[path to DB file]
在服务运行期间删除DB文件后,仍可通过H2控制台或服务正常查询数据库;甚至新增记录后也能被持久化查询,请问这一现象的原因是什么?
原因分析
- 内存缓存+延迟写入机制:H2的文件模式默认会把数据库数据加载到内存中运行,并且不会实时将所有操作同步写入磁盘文件。删除磁盘上的DB文件后,服务和控制台的所有操作其实都是基于内存中的数据副本进行的,新增的记录也暂时存在内存里,直到触发磁盘写入逻辑(比如事务提交、定时刷盘或者服务关闭前)。
- 操作系统文件句柄特性:当Spring Boot服务启动后,H2进程会持有DB文件的文件句柄。此时在文件系统中删除该文件,操作系统并不会立刻真正删除文件内容,而是会保留文件的inode数据,直到持有该文件句柄的进程完全关闭。这意味着H2依然可以通过持有的句柄访问到文件的实际内容,新增的记录也会正常写入到这个“隐形”的文件中,所以查询时能看到这些数据。
内容的提问来源于stack exchange,提问作者ThCollignon
相关产品推荐
相关产品推荐

