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

Java 是否可以从Spring引导应用程序压缩嵌入式HSQL DB?,java,spring-boot,hsqldb,embedded-database,compact-database,Java,Spring Boot,Hsqldb,Embedded Database,Compact Database,我已经创建了一个带有嵌入式、基于文件的HSQL数据库的Spring Boot应用程序。正在创建的数据文件变得相当大,特别是考虑到使用模型,所以我想知道是否有一种方法可以压缩它?手动还是自动 HSQL文档表明有一个SHUTDOWN COMPACT命令(根据文档,这可能需要一段时间),但我不知道如何配置Spring Boot来使用它 在关闭Spring Boot应用程序时(如果这是唯一的选项),或者找到一种方法来发出手动“COMPACT”命令(如果HSQLDB支持这样一个命令),或者其他人可能会提出

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

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

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

不确定这是否是最好的解决方案,但我确实找到了一个解决方案。我添加了一个RESTAPI,可以在数据库上手动执行
检查点碎片整理
命令

在主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;
    }
}
从安全的角度来看,这不是很好;对于我的用例来说,这不是一个问题,但对于其他人来说,这可能是一个不好的开始

这其中有两个要点:

  • 用于获取JdbcTemplate的
    @Bean
  • 调用
    jdbcTemplate.execute()
    以执行“原始”SQL命令
  • 不确定这是否是最好的解决方案,但我确实找到了一个解决方案。我添加了一个RESTAPI,可以在数据库上手动执行
    检查点碎片整理
    命令

    在主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;
        }
    }
    
    从安全的角度来看,这不是很好;对于我的用例来说,这不是一个问题,但对于其他人来说,这可能是一个不好的开始

    这其中有两个要点:

  • 用于获取JdbcTemplate的
    @Bean
  • 调用
    jdbcTemplate.execute()
    以执行“原始”SQL命令

  • 如前所述,前面的答案是一种选择,但boly38的建议更干净,成为我的首选方法

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

    这允许应用程序控制何时压缩DB,并从最终用户手中删除一个可能不好的选项。

    如前所述,前面的答案是一个选项,但boly38的建议更干净,成为我的首选方法

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

    这允许应用程序控制何时压缩DB,并从最终用户手中删除一个可能不好的选项。

    您也可以通过@PreDestroy method()调用DB命令以避免暴露管理端点。您还可以通过@PreDestroy method()调用DB命令以避免暴露管理端点