为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

万千封印 2023-01-05 16:55:11

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

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

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


查看完整描述

2 回答

?
30秒到达战场

TA贡献1549条经验 获得超6个赞

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


@PreDestroy

public void preDestroy() {

    try {

        jdbcTemplate.execute("SHUTDOWN COMPACT");

    } catch (DataAccessException e) {

        // do nothing

    }

}

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


查看完整回答
反对 回复 2023-01-05
?
PIPIONE

TA贡献1570条经验 获得超9个赞

不确定这是否是最佳解决方案,但我确实设法找到了解决方案。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 命令的调用


查看完整回答
反对 回复 2023-01-05

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信