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备份到byte[]?我读过SqliteConnection,它也没有给出InputStream。
一种选择是不要在内存db中使用url作为"jdbc:sqlite:/some-location“,然后我们可以使用FileUtils.readFileToByteArray(new File(some-location)),但不确定我们是否可以在内存sqlite中使用相同的操作,而仍然可以使用Jooq的DSLContext。
发布于 2018-11-01 14:00:39
backup to语法不是本机SQLite SQL语法,而是Xerial驱动程序根据这里的文档提供
将整个数据库备份到backup.db文件: //创建内存数据库连接conn = DriverManager.getConnection("jdbc:sqlite:");语句stmt = conn.createStatement();//执行一些更新stmt.executeUpdate(“创建表示例(id,name)");stmt.executeUpdate(”插入示例值(1,\“leo\”));stmt.executeUpdate(“插入示例值(2,\"yui\")");//将数据库内容转储到文件stmt.executeUpdate(”备份到backup.db");从备份文件恢复数据库: //创建内存数据库连接conn = DriverManager.getConnection("jdbc:sqlite:");//从备份文件语句stat =conn.createStatement()还原数据库;从stat.executeUpdate(“从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
https://stackoverflow.com/questions/53102512
复制相似问题