我需要将整个内存数据库导出到sql文件。例如,要创建一个@Controller,它返回当前in-mem db状态的整个SQL生成字符串,或者将其保存在磁盘上的某个位置。
配置:
我试图找到一种方法来导出数据 - 架构和所有行 - 但我没有成功。 在这样的文章中:http://java.dzone.com/articles/how-generate-schema-creation Ejb3Configuration从hibernate中删除,因此描述的方法不起作用。
有没有好办法呢?
答案 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,但这不是您需要的。
祝你好运!