java - 如何从脚本文件创建 HSQL in-memory-db?

标签 java hsqldb spring-jdbc

我在内存中有两个 HSQL 数据库。使用第一个数据库,我创建了数据库结构和测试数据,这很耗时。此数据库通过 SCRIPT 命令导出到一个 sql 文件中。我的第二个数据库(不一定在同一个 JVM 中)应该从导出的 sql 文件构建。

public static void main(String[] args) throws Exception {
    try (Connection firstConnection = DriverManager.getConnection("jdbc:hsqldb:mem:connection1", "sa", "")) {
        try (Statement statement = firstConnection.createStatement()) {
            statement.execute("CREATE TABLE table1 (id INT)");
            statement.execute("SCRIPT 'my.script'");
        }
    }

    try (Connection secondConnection = DriverManager.getConnection("jdbc:hsqldb:mem:connection2", "sa", "")) {
        ScriptUtils.executeSqlScript(secondConnection, new FileSystemResource("my.script"));
    }
}

调用 ScriptUtils.executeSqlScript() 时出现以下异常:

Caused by: java.sql.SQLInvalidAuthorizationSpecException: invalid authorization specification - already exists: SA in statement [CREATE USER SA PASSWORD DIGEST 'd41d8cd98f00b204e9800998ecf8427e']
    at org.hsqldb.jdbc.JDBCUtil.sqlException(JDBCUtil.java:327)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(JDBCUtil.java:247)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(JDBCStatement.java:1817)
    at org.hsqldb.jdbc.JDBCStatement.execute(JDBCStatement.java:638)
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:457)
    ... 3 more
Caused by: org.hsqldb.HsqlException: invalid authorization specification - already exists: SA
    at org.hsqldb.error.Error.error(Error.java:83)
    at org.hsqldb.error.Error.error(Error.java:72)
    at org.hsqldb.rights.GranteeManager.addUser(GranteeManager.java:623)
    at org.hsqldb.rights.UserManager.createUser(UserManager.java:115)
    at org.hsqldb.StatementSchema.getResult(StatementSchema.java:1026)
    at org.hsqldb.StatementSchema.execute(StatementSchema.java:268)
    at org.hsqldb.Session.executeCompiledStatement(Session.java:1378)
    at org.hsqldb.Session.executeDirectStatement(Session.java:1248)
    at org.hsqldb.Session.execute(Session.java:1008)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(JDBCStatement.java:1809)
    ... 5 more

导出现有内存数据库并稍后将其导入另一个(空)内存数据库的正确方法是什么?

最佳答案

SCRIPT 语句创建一个完整的数据库脚本,可以作为文件数据库打开。将第二个数据库作为文件打开:不存储修改的数据库。

Connection secondConnection = DriverManager.getConnection("jdbc:hsqldb:file:my;files_readonly=true", "sa", "")

关于java - 如何从脚本文件创建 HSQL in-memory-db?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33362924/

相关文章:

java - 使用正则表达式解析表 - Java

java - Spring boot - 多个DataSource的连接池属性

java - 我应该将哪种嵌入式 RDBMS 与 Java 结合使用?为什么?备份和维护呢?

java - 对数据库进行单元测试时遇到多个架构问题

Spring-boot 使用 schema.sql 和 data.sql 填充 H2 数据库

java - 在 jdbcTemplate 或 DataSource 上提交

java - 如何使用 nslookup 检查 Java 中的互联网可用性?

java - Codenameone 上的 YouTube 播放器

java - 如何在使用 GridBagLayout 布局的 JTextPane 中对文本进行换行

java - 查询通知