1

我创建了一个带有嵌入式、基于文件的 HSQL 数据库的 Spring Boot 应用程序。正在创建的数据文件变得相当大,特别是考虑到使用模型,所以我想知道是否有一种方法可以压缩它?是手动还是自动?

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

我愿意SHUTDOWN COMPACT在关闭 Spring Boot 应用程序时强制执行(如果这是唯一的选择),或者找到一种方法来发出手动“紧凑”命令(如果 HSQLDB 支持这样的命令),或者人们可能有任何其他建议.

4

2 回答 2

1

如前所述,先前的答案是一种选择,但 boly38 的建议更简洁,并成为我的首选方法。

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

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

于 2019-06-10T15:02:30.747 回答
0

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

在主 Spring Boot 应用程序类中,我添加了一个方法来获取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;
    }
}

从安全角度来看,这不是很好。对于我的用例来说,这不是一个问题,但对于其他人来说,这可能是一个非首发。

这里面的两个要点:

  1. 为了@Bean得到一个JdbcTemplate
  2. jdbcTemplate.execute()执行“原始”SQL 命令的调用
于 2019-06-06T20:04:58.613 回答