Ответ на вопрос 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 для получения inputtream / byteArray?
Конечно, просто извлеките байтовый массив из вашей базы данных, используя jOOQ, в этом нет ничего особенного.
Если несколько таких контекстов «в памяти» создаются в отдельных потоках, может ли быть какое-либо условие гонки с чтением / записью 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
, данные исчезнут