h2.db文件不断增长

时间:2012-08-02 19:30:11

标签: h2

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

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

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

compacting是唯一的选择吗?压缩将需要重新启动数据库,这是我们无法做到的。

3 个答案:

答案 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