Java 是否可以从Spring引导应用程序压缩嵌入式HSQL DB?
我已经创建了一个带有嵌入式、基于文件的HSQL数据库的Spring Boot应用程序。正在创建的数据文件变得相当大,特别是考虑到使用模型,所以我想知道是否有一种方法可以压缩它?手动还是自动 HSQL文档表明有一个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支持这样一个命令),或者其他人可能会提出
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;
}
}
从安全的角度来看,这不是很好;对于我的用例来说,这不是一个问题,但对于其他人来说,这可能是一个不好的开始
这其中有两个要点:
@Bean
jdbcTemplate.execute()
以执行“原始”SQL命令检查点碎片整理
命令
在主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;
}
}
从安全的角度来看,这不是很好;对于我的用例来说,这不是一个问题,但对于其他人来说,这可能是一个不好的开始
这其中有两个要点:
@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命令以避免暴露管理端点