Дамп памяти sqlite с использованием контекста jooq в byte [] - PullRequest
0 голосов
/ 01 ноября 2018

Теперь нужно получить байт [] из дБ памяти, как показано ниже.

 DSLContext dsl = DSL.using("jdbc:sqlite::memory:");
  • Можем ли мы использовать DSLContext для получения inputtream / byteArray?

  • Если несколько таких контекстов «в памяти» создаются в отдельных потоках, может ли быть какое-либо условие гонки с чтением / записью sqlite со стороны DSLContext?

1 Ответ

0 голосов
/ 01 ноября 2018

Ответ на вопрос 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, данные исчезнут

...