使用jooq上下文将内存sqlite转储到字节[]

Posted

技术标签:

【中文标题】使用jooq上下文将内存sqlite转储到字节[]【英文标题】:Dump in memory sqlite using jooq context to byte[] 【发布时间】:2019-04-05 12:16:14 【问题描述】:

现在需要从内存数据库中获取字节[],如下所示。

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

我们可以使用 DSLContext 来获取 inputstream / byteArray 吗?

如果在单独的线程中创建了多个这样的“内存中”上下文,是否存在任何竞争条件 w.r.t sqlite 从 DSLContext 端读取/写入?

【问题讨论】:

【参考方案1】:

您问题的 jOOQ 方面很容易回答。你在那里做的事情是不完整的。如果您使用DSL.using(String)DSL.using(String, Properties)DSL.using(String, String, String) 方法,您将获得一个"resourceful" DSLContext,您必须自己关闭它(为了关闭底层 JDBC 连接。例如:

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

请注意,jOOQ 会为您创建一个底层 JDBC 连接,并针对在 dsl 上调用的所有方法对其进行操作。除此之外,一切的工作方式与您使用 JDBC 连接的方式完全相同:

try (Connection connection = DriverManager.getConnection("jdbc:sqlite::memory:") 
    ...

关于您的具体问题:

我们可以使用 DSLContext 来获取 inputstream / byteArray 吗?

当然,只需使用 jOOQ 从数据库中获取一个字节数组,没有什么特别之处。

如果在单独的线程中创建了多个这样的“内存中”上下文,是否存在任何竞争条件 w.r.t sqlite 从 DSLContext 端读取/写入?

在没有正式验证文档的情况下,可以相对简单地通过经验检查:

try (
    DSLContext ctx1 = DSL.using("jdbc:sqlite::memory:");
    DSLContext ctx2 = DSL.using("jdbc:sqlite::memory:");
) 
    ctx1.execute("create table x (i int primary key, j varchar(10))");
    ctx1.execute("insert into x values (1, 'c1')");
    ctx2.execute("create table x (i int primary key, j varchar(10))");
    ctx2.execute("insert into x values (1, 'c2')");

    System.out.println(ctx1.fetch("select i, j from x"));
    System.out.println(ctx2.fetch("select i, j from x"));

不仅重新创建表x时没有异常,第二次插入主键值1也没有违反约束。输出是:

+----+----+
|   i|j   |
+----+----+
|   1|c1  |
+----+----+

+----+----+
|   i|j   |
+----+----+
|   1|c2  |
+----+----+

而且,一旦你关闭连接/DSLContext,数据就消失了

【讨论】:

感谢 Lukas,解决这个问题“使用 jOOQ 从您的数据库中获取一个字节数组”。我认为必须执行 dsl.execute("DUMP")。基本上需要完整转储内存中的sqlite db,而不仅仅是几张表 我检查了 SQLiteConnection 但找不到任何 getInputStream 。 @fortm:关于这些字节数组,我很乐意回答其他后续问题,并提供有关您要从数据库中获取的确切数据集的详细信息。我认为最好提出一个新问题而不是编辑这个问题...... 创建了另一个问题***.com/questions/53102512/…

以上是关于使用jooq上下文将内存sqlite转储到字节[]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jOOQ 通过 SQLite 正确生成日期和时间类型

加载数据转储时,将 Django 项目从 sqlite3 后端切换到 postgresql 失败

在java中,如何清除每个方法中的字节[]数组以保护值免受内存转储?

将 SQLite3 转储导入数据库

使用 JOOQ 更新 SQLITE 中的表行失败

转储 sqlite3 数据库以在 Titanium 中使用