使用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 失败