使用 jooq 上下文在内存 sqlite db 中备份到字节数组

private byte[] inMemSqliteDbBackup() {

    byte[] data = null;

    try (DSLContext dsl = DSL.using("jdbc:sqlite::memory:") {

        ...

        //insert some data 

        dsl.execute("backup to " + data); // backup to byte[], but unsupported , a file is needed 

        dsl.connection(connection -> {

            // or, get underlying connection and open inputstream 

            // but there is no getInputStream in SqliteConnection

        });

    }

    return data;

}

我们如何在内存中将 sqlite db 备份到 byte[] ?我经历了 SqliteConnection 并且它也没有给出 InputStream 。


一种选择是通过将 url 用作“ jdbc:sqlite:/some-location”而不在内存数据库中使用,然后我们可以使用FileUtils.readFileToByteArray(new File(some-location)),但不确定我们是否可以在内存中使用 sqlite db 并仍然使用 Jooq 的 DSLContext。


倚天杖
浏览 164回答 1
1回答

喵喵时光机

该backup to语法不是本机 SQLite SQL 语法,而是由 Xerial JDBC 驱动程序根据此处的文档提供:将整个数据库备份到 backup.db 文件中:// Create a memory databaseConnection conn = DriverManager.getConnection("jdbc:sqlite:");Statement stmt = conn.createStatement();// Do some updatesstmt.executeUpdate("create table sample(id, name)");stmt.executeUpdate("insert into sample values(1, \"leo\")");stmt.executeUpdate("insert into sample values(2, \"yui\")");// Dump the database contents to a filestmt.executeUpdate("backup to backup.db");Restore the database from a backup file:// Create a memory databaseConnection conn = DriverManager.getConnection("jdbc:sqlite:");// Restore the database from a backup fileStatement stat = conn.createStatement();stat.executeUpdate("restore from backup.db");如果您对他们的来源进行逆向工程,您可以看到该命令被拦截,并转换为以下特定方法org.sqlite.core.NativeDB:native synchronized int backup(byte[] dbNameUtf8, byte[] destFileNameUtf8,        ProgressObserver observer) throws SQLException;即它绑定到 SQLite 备份 API,它只能对实际文件进行操作,不能对内存中的数据结构进行操作。因此,恐怕您无法使用当前版本的 SQLite 拦截该备份并将其发送到byte[]变量中,而无需编写中间临时文件,无论是直接使用 jOOQ 或 JDBC 还是本机 SQLite
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java