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

时间:2018-11-01 09:31:27

标签: sqlite jooq

现在需要如下从内存db中获取byte []。

PdfReader reader = new PdfReader("path to PDF form file");

stamp = new PdfStamper(reader, new FileStream("path to filled PDF form file", FileMode.Create));

AcroFields form = stamp.AcroFields;

IDictionary<string, AcroFields.Item> fs = form.Fields;

foreach (var f in fs)
{
    form.SetField(f.Key, "some value");
}

stamp.Close();
  • 我们可以使用DSLContext来获取inputstream / byteArray吗?

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

1 个答案:

答案 0 :(得分:1)

问题的jOOQ方面很容易回答。您在这里所做的是不完整的。如果您使用的是DSL.using(String)DSL.using(String, Properties)DSL.using(String, String, String)方法,则将获得“资源丰富” 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从数据库中获取字节数组,就没有什么特别的了。

  

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

无需正式验证文档,就可以相对简单地凭经验进行检查:

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,数据就消失了