我们正在使用嵌入在我们的应用程序中的H2数据库(持久性)。
即使我们删除了表,h2.db文件也在不断增长。
我们尝试禁用事务隔离(LOCK_MODE = 0),禁用查询日志(TRACE_LEVE_FILE = 0),禁用撤消日志,但没有任何帮助。
compacting是唯一的选择吗?压缩将需要重新启动数据库,这是我们无法做到的。
答案 0 :(得分:3)
使用TRACE_LEVE_FILE=0
只会影响文件{databaseName}.trace.db
,我建议不要使用禁用跟踪。文件{databaseName}.trace.db
包含人类可读的错误消息和警告,通常应为空。如果它不是空的,那么您的应用程序中可能存在错误。
增长数据库文件的最常见原因是未提交的事务。你承诺了所有交易吗?使用最新版本的H2(1.3.168),“事务日志无法截断”消息将写入{databaseName}.trace.db
文件。但这要求您不要使用TRACE_LEVE_FILE=0
。
请注意,文件中的空白空间会被重复使用,但在数据库打开时文件不会缩小。
答案 1 :(得分:1)
此问题已得到解决。问题是我们使用servlet context中存储的连接。此连接从未关闭。我们更改了代码以自行管理连接,并在删除表(并重新打开)后关闭连接。
答案 2 :(得分:0)
我能够缩小 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