是否可以从Spring Boot应用程序压缩嵌入式HSQL DB?

时间:2019-06-06 15:27:54

标签: java spring-boot hsqldb embedded-database compact-database

我已经创建了一个带有嵌入式,基于文件的HSQL数据库的Spring Boot应用程序。正在创建的数据文件越来越大,尤其是在给定使用模型的情况下,所以我想知道是否存在一种可以压缩它的方法?手动还是自动?

HSQL文档指示存在一个SHUTDOWN COMPACT命令(根据文档,这可能会花费一些时间),但是我不知道如何配置Spring Boot以使用它。

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

2 个答案:

答案 0 :(得分:0)

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

在主要的Spring Boot应用程序类中,我添加了一种获取JdbcTemplate的方法,如下所示:

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

然后我决定创建一个新的REST控制器(而不是使用现有的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的{​​{1}}
  2. 调用JdbcTemplate以执行“原始” SQL命令

答案 1 :(得分:0)

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

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

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