我们正在使用嵌入在我们的应用程序中的 H2 数据库(持久)。
即使我们删除了这些表,h2.db 文件仍在不断增长。
我们尝试禁用事务隔离(LOCK_MODE=0),禁用查询日志(TRACE_LEVE_FILE=0),禁用撤消日志,但没有任何帮助。
压缩是唯一的选择吗?压缩将需要重新启动我们无法执行的数据库。
使用TRACE_LEVE_FILE=0
只会影响文件{databaseName}.trace.db
,我建议不要使用禁用跟踪。该文件{databaseName}.trace.db
包含人类可读的错误消息和警告,通常应该为空。如果它不为空,则您的应用程序中可能存在错误。
数据库文件增长的最常见原因是未提交的事务。你提交了所有交易吗?使用最新版本的 H2 (1.3.168),将消息“无法截断事务日志”写入{databaseName}.trace.db
文件。但这要求你不要使用TRACE_LEVE_FILE=0
.
请注意,文件中的空白空间被重复使用,但在数据库打开时文件不会缩小。
这个问题得到了解决。问题是我们使用存储在servlet 上下文中的连接。此连接从未关闭。我们更改了代码以自己管理连接并在删除表(并重新打开)后关闭连接。
我能够缩小 H2 数据库的最有效和最简单的方法是执行以下语句SHUTDOWN COMPACT,然后执行SHUTDOWN DEFRAG。它清理任何删除记录后留下的未使用空间。
DatasourceConfig datasourceConfig = springContext.getBean(DatasourceConfig.class);
System.out.println("H2 DB shutdown hook");
Connection con = null;
try {
con = DriverManager.getConnection(datasourceConfig.getDatasourceUrl(), datasourceConfig.getUsername(), "");
con.createStatement().execute("SHUTDOWN DEFRAG");
} catch (SQLException var13) {
System.out.println("Could not shut down embedded database" + var13);
} finally {
if(con != null) {
try {
con.close();
} catch (Throwable var12) {
System.out.println("Could not close JDBC Connection on shutdown" + var12);
}
}
}
您可以找到有关 SHUTDOWN 语句的更多详细信息。https://www.h2database.com/html/commands.html#shutdown