резервное копирование в памяти sqlite db в байтовый массив с использованием jooq - PullRequest
0 голосов
/ 01 ноября 2018
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 to byte []? Я прошел через SqliteConnection, и он тоже не дает InputStream.

один вариант - не использовать в памяти дБ, используя url в качестве "jdbc:sqlite:/some-location", и тогда мы можем использовать FileUtils.readFileToByteArray(new File(some-location)), но не уверен, сможем ли мы сделать то же самое с памятью sqlite db и все еще использовать DSLContext от Jooq .

1 Ответ

0 голосов
/ 01 ноября 2018

Этот синтаксис backup to не является собственным синтаксисом SQLite SQL, но предлагается драйвером Xerial JDBC в соответствии с их документами здесь :

Сделайте резервную копию всей базы данных в файл backup.db:

// Create a memory database
Connection conn = DriverManager.getConnection("jdbc:sqlite:");
Statement stmt = conn.createStatement();
// Do some updates
stmt.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 file
stmt.executeUpdate("backup to backup.db");
Restore the database from a backup file:
// Create a memory database
Connection conn = DriverManager.getConnection("jdbc:sqlite:");
// Restore the database from a backup file
Statement 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;

т.е. он связан с API резервного копирования SQLite, который может работать только с реальными файлами, а не со структурами данных в памяти.

Итак, я боюсь, что в текущих версиях SQLite вы не сможете перехватить эту резервную копию и отправить ее в переменную byte[] без записи промежуточного временного файла, независимо от того, используете ли вы непосредственно jOOQ, JDBC или собственный SQLite

...