现在需要如下从内存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的任何竞争条件?
答案 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
,数据就消失了