Можно ли сжать встроенную базу данных HSQL из приложения Spring Boot? - PullRequest
0 голосов
/ 06 июня 2019

Я создал приложение Spring Boot со встроенной файловой базой данных HSQL. Создаваемый файл данных становится довольно большим, особенно с учетом модели использования, поэтому мне интересно, есть ли способ его сжатия? Вручную или автоматически?

В документации HSQL указано, что есть команда SHUTDOWN COMPACT (которая может занять некоторое время, согласно документации), но я не могу понять, как настроить Spring Boot для ее использования.

Я открыт для принудительного ввода SHUTDOWN COMPACT при закрытии приложения Spring Boot (если это единственный вариант) или в поиске способа выполнить ручную «компактную» команду (если HSQLDB поддерживает такую ​​команду), или любые другие предложения, которые могут иметь люди.

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Как уже упоминалось, предыдущий ответ является одним из вариантов, но предложение boly38 является более чистым и стало моим предпочтительным подходом.

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

Это позволяет приложению контролировать, когда БД сжимается, и удаляетпотенциально плохой вариант с руки конечного пользователя.

0 голосов
/ 06 июня 2019

Не уверен, что это лучшее решение, но мне удалось найти решение. Я добавил REST API, который может вручную выполнить команду CHECKPOINT DEFRAG в базе данных.

В основной класс приложения 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
...