Spring Boot从内存数据库导出SQL

时间:2014-10-22 00:50:10

标签: spring hibernate spring-mvc jpa spring-boot

我需要将整个内存数据库导出到sql文件。例如,要创建一个@Controller,它返回当前in-mem db状态的整个SQL生成字符串,或者将其保存在磁盘上的某个位置。

配置:

  • Spring Boot 1.8
  • Spring Data JPA 1.7
  • Hibernate 4.3.6
  • HSQLDB 2.3.2

我试图找到一种方法来导出数据 - 架构和所有行 - 但我没有成功。 在这样的文章中:http://java.dzone.com/articles/how-generate-schema-creation Ejb3Configuration从hibernate中删除,因此描述的方法不起作用。

有没有好办法呢?

2 个答案:

答案 0 :(得分:3)

当您使用HSQLDB时,可以使用其SCRIPT command。如果你只是调用SCRIPT,它将返回一个包含数据库模式的结果集。您还可以将路径传递给文件,并将整个数据库转储到该文件。例如SCRIPT '/path/to/dump.sql'。如您所希望的那样,架构和所有行都应该使用后者。请注意,如果文件已存在,该命令将失败。

当您使用Spring Boot时,执行SCRIPT命令的一种简单方法是使用JdbcTemplate。默认情况下,如果您的应用程序具有DataSource,那么您的应用程序上下文中将自动提供JdbcTemplate实例。

触发数据库转储的@Controller

import java.io.File;
import java.io.IOException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class DumpDbController {

    private final Object monitor = new Object();

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public DumpDbController(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @RequestMapping("/dumpDb")
    @ResponseBody
    public void dumpDb() throws IOException {
        synchronized (this.monitor) {
            File dump = new File("dump.sql");
            if (dump.exists()) {
                dump.delete();
            }
            this.jdbcTemplate.execute("script '" + dump.getAbsolutePath() + "'");
        }
    }
}

请注意使用同步来确保多个线程不会同时尝试转储数据库。

答案 1 :(得分:0)

看看liquibase。该实用程序具有可以生成您需要的脚本的方法,但我认为您必须使用其API来存档它。

它有一个command line实用程序,您可以调查如何与它集成。此外,还有一个Integration tool with spring,但这不是您需要的。

祝你好运!