Встроенная база данных H2: многопоточный доступ - PullRequest
0 голосов
/ 02 марта 2020

У меня есть программа, которая анализирует некоторые данные из файлов HTML, а затем выполняет некоторые вычисления для этих файлов в зависимости от текущей даты.

Поскольку анализ файлов занимает много времени, и они не меняются, теперь я храню данные во встроенной базе данных H2 и анализирую их, только если данные из этого файла еще не находятся в базе данных. В противном случае я просто запрашиваю его из базы данных. Тем не менее, при первоначальном разборе, а также при появлении новых файлов это занимает много времени.

Итак, я сейчас нахожусь в точке, где я пытаюсь выполнить многопоточность разбора. Я хочу сделать это, используя ExecutorService и разделить файлы на несколько задач (одна на файл, вероятно, не очень хорошая идея, вероятно, будет 10-20 задач для использования всех ядер). Сейчас я не знаю, как мне реализовать доступ к базе данных. Должен ли я иметь только одно соединение и создавать необходимые PreparedStatements для каждой задачи, или я должен использовать пул соединений (а также создавать PreparedStatements для каждой задачи) или что-то еще?

1 Ответ

0 голосов
/ 02 марта 2020

В JDB C объект Connection может иметь несколько экземпляров Statement и PreparedStatement, но они не могут выполнять свою работу одновременно. Если вы выполняете некоторые команды одновременно, они будут выполняться одна за другой. Безопасно, если они не зависят друг от друга, и вы не изменяете настройки соединения в них, но ваши потоки будут ждать завершения команд из других потоков. Если ваши команды не работают достаточно быстро, эти дополнительные задержки могут быть заметны. В этом случае вы можете создать собственный Connection для каждого потока и создать Statement или PreparedStatement экземпляров для этого потока из его собственного соединения. Различные соединения могут выполнять команды одновременно.

В H2 вам также нужна последняя версия базы данных, и вам нужно использовать механизм MVStore по умолчанию. Устаревший механизм PageStore (;MV_STORE=FALSE) работает в однопоточном режиме. Более старые версии H2 также используют однопоточный режим по умолчанию с обоими механизмами хранения, и не совсем безопасно явно включать в них многопоточность.

...