【问题标题】:H2 database, is there any way to reload past data?H2数据库,有没有办法重新加载过去的数据?
【发布时间】:2016-01-05 00:59:11
【问题描述】:

有没有办法在服务器关闭后重新加载过去的数据?

我认为我必须将数据保存为文件类型,所以我输入了 url 添加了 ':file:' 也可以找到一个数据库文件 (databasename.mv.db)。但是每次我重新连接时,文件都会被覆盖。如果有人知道如何处理它,请告诉我。

【问题讨论】:

  • 您是否正在运行 H2 服务器然后连接到它?您在服务器上使用什么 JDBC 连接字符串,在客户端使用什么连接字符串?
  • 我在服务器端使用spring boot并创建一些数据(调用服务器端脚本创建20个随机数据进行测试)并通过H2控制台搜索这些数据。双方的连接字符串都是'jdbc:h2:file:~/data/DBTest'。

标签: spring-boot h2 in-memory


【解决方案1】:

我喜欢在初始开发阶段/将测试数据加载到应用程序中执行此操作的方式是将数据存储在 CSV 文件中,然后在 spring-boot 应用程序启动时使用 ContextRefreshedEvent 将其加载到 H2 中下面:

@Component
public class RootVerbLoader implements ApplicationListener<ContextRefreshedEvent> {

private static final int SOURCE_LANGUAGE = 1;
private static final int TARGET_LANGUAGE = 2;
private RootVerbRepository repo;

@Autowired
public void setRepo(RootVerbRepository repo) {
    this.repo = repo;
}

@Override
public void onApplicationEvent(ContextRefreshedEvent arg0) {

    loadDataFromCSV("classpath:hanasu.csv", "to speak", "はなす");
    loadDataFromCSV("classpath:iku.csv", "to go", "いく");
    loadDataFromCSV("classpath:iu.csv", "to say", "いう");
    loadDataFromCSV("classpath:kaku.csv", "to write", "かく");
    loadDataFromCSV("classpath:kasegu.csv", "to earn", "かせぐ");
    loadDataFromCSV("classpath:kuru.csv", "to come", "くる");
    loadDataFromCSV("classpath:matsu.csv", "to wait", "まつ");
    loadDataFromCSV("classpath:miru.csv", "to look", "みる");
    loadDataFromCSV("classpath:naru.csv", "to become", "なる");
    loadDataFromCSV("classpath:nomu.csv", "to drink", "のむ");
    loadDataFromCSV("classpath:shinu.csv", "to die", "しぬ");
    loadDataFromCSV("classpath:suru.csv", "to do", "する");
    loadDataFromCSV("classpath:yobu.csv", "to call", "よぶ");
}

private void loadDataFromCSV(String filename, String source, String target) {

    Set<TranslationPair> conjugations = new HashSet<>();

    try {

        ResultSet rs = new Csv().read(filename, null, null);
        int i = 1;
        while (rs.next()) {
            conjugations.add(
                new TranslationPair(
                    rs.getString(SOURCE_LANGUAGE),
                    rs.getString(TARGET_LANGUAGE),
                    i
                )
            );
            i++;
        }

        rs.close();

    } catch(SQLException se) {
        se.printStackTrace();
    }

    repo.save(new RootVerb(source, target, conjugations));
}

}

将数据写入 CSV 文件的代码也非常简单:

SimpleResultSet rs = new SimpleResultSet();
rs.addColumn("NAME", Types.VARCHAR, 255, 0);
rs.addColumn("EMAIL", Types.VARCHAR, 255, 0);
rs.addRow("Bob Meier", "bob.meier@abcde.abc");
rs.addRow("John Jones", "john.jones@abcde.abc");
new Csv().write("data/test.csv", rs, null);

我发现这为原型数据结构/表模式提供了一种非常快速的方法,而无需编写任何 sql 脚本或做很多工作。上手速度真的很快。

【讨论】:

  • 感谢您的帮助:)
  • 不客气。我很高兴发现 h2 具有此功能,而且实现起来非常容易,因此非常乐意分享知识。如果此答案解决了您的问题,请将其标记为已接受的答案,以便社区知道:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多