1

我们正在使用嵌入在我们的应用程序中的 H2 数据库(持久)。

即使我们删除了这些表,h2.db 文件仍在不断增长。

我们尝试禁用事务隔离(LOCK_MODE=0),禁用查询日志(TRACE_LEVE_FILE=0),禁用撤消日志,但没有任何帮助。

压缩是唯一的选择吗?压缩将需要重新启动我们无法执行的数据库。

4

3 回答 3

4

使用TRACE_LEVE_FILE=0只会影响文件{databaseName}.trace.db,我建议不要使用禁用跟踪。该文件{databaseName}.trace.db包含人类可读的错误消息和警告,通常应该为空。如果它不为空,则您的应用程序中可能存在错误。

数据库文件增长的最常见原因是未提交的事务。你提交了所有交易吗?使用最新版本的 H2 (1.3.168),将消息“无法截断事务日志”写入{databaseName}.trace.db文件。但这要求你不要使用TRACE_LEVE_FILE=0.

请注意,文件中的空白空间被重复使用,但在数据库打开时文件不会缩小。

于 2012-08-03T09:59:15.303 回答
1

这个问题得到了解决。问题是我们使用存储在servlet 上下文中的连接。此连接从未关闭。我们更改了代码以自己管理连接并在删除表(并重新打开)后关闭连接。

于 2012-08-03T12:31:04.223 回答
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

于 2021-04-01T11:09:59.953 回答