是否可以从 Spring 引导应用程序压缩嵌入式 HSQL 数据库?

Is it possible to compact an embedded HSQL DB from a Spring Boot application?

我已经创建了一个 Spring 引导应用程序,其中包含一个基于文件的嵌入式 HSQL 数据库。正在创建的数据文件变得相当大,特别是考虑到使用模型,所以我想知道是否有办法压缩它?手动还是自动?

HSQL 文档指出有一个 SHUTDOWN COMPACT 命令(根据文档,这可能需要一段时间),但我不知道如何配置 Spring 引导使用它。

我愿意在关闭 Spring 引导应用程序时强制执行 SHUTDOWN COMPACT(如果这是唯一的选择),或者想办法发出手动 "compact" 命令(如果 HSQLDB 支持这样的命令),或者人们可能有的任何其他建议。

不确定这是否是最佳 解决方案,但我确实找到了a 解决方案。我添加了一个可以在数据库上手动执行 CHECKPOINT DEFRAG 命令的 REST API。

在主 Spring 引导应用程序 class 中,我添加了一个获取 JdbcTemplate 的方法,如下所示:

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

然后我决定创建一个新的 REST 控制器(而不是使用现有控制器),以提供 API 来手动压缩数据库:

@RestController
@RequestMapping("/admintools")
public class TEVAdminToolsController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/compressDB")
    public Boolean compressDB() {
        try {
            jdbcTemplate.execute("CHECKPOINT DEFRAG");
        } catch (DataAccessException e) {
            return false;
        }

        return true;
    }
}

从安全角度来看,这不是很好;对于我的用例,这不是问题,但对于其他人来说,它可能是 non-starter.

这里面的两个要点:

  1. 获得JdbcTemplate
  2. @Bean
  3. 调用jdbcTemplate.execute()执行"raw"SQL命令

如前所述,之前的答案是一种选择,但 boly38 的建议更清晰,成为我的首选方法。

@PreDestroy
public void preDestroy() {
    try {
        jdbcTemplate.execute("SHUTDOWN COMPACT");
    } catch (DataAccessException e) {
        // do nothing
    }
}

这允许应用程序控制何时压缩数据库,并从 end-user 手中移除一个潜在的错误选项。