Параллелизм во встроенных (в процессе) базах данных H2, Hsqldb, Apache Derby, SQLite (JDBC)

Возможно ли одновременное использование встроенных баз данных (чтение/запись) на одном компьютере (без сервера) с разными процессами. А как насчет одновременного чтения/записи в одном многопоточном процессе?

Я пытаюсь выяснить, как параллелизм решается в HSQL, H2, Apache Derby и SQLite (через xerial JDBC), но я плохо понимаю этот механизм блокировки (MVCC, OCC и т. д.), поэтому мне нужен кто-то, чтобы исправить то, что я нашел.

  1. H2: Only one process possibly multithreaded can be connected to the database.
    • Table level locking for writes read operations doesnt require lock and can be done concurrently with write (N readers one writer)
    • MVCC — блокировка на уровне таблицы или строки для записи (N читателей один писатель??)
  2. Hsql: выглядит так же, как H2, но есть некоторые отличия в механизме MVCC.
  3. Apache Derby (JavaDB): Only one process possibly multithreaded can be connected to the database.
    • Table level locking or row level locking for writes. Read operations doesnt require lock and can be done concurrently with writes (N readers one writer)
  4. SQLite (xerial JDBC): multiple processes can connect simultaneously but only one can do writting operations. (database locking).
    • when there is a write lock other processes or threads cant perform read and write operations??

person user4949624    schedule 28.05.2015    source источник


Ответы (3)


HSQLDB поддерживает полную многопоточность во всех трех поддерживаемых ею моделях транзакций (MVCC, LOCKS и MVLOCKS, то есть MVCC с блокировками на уровне таблицы).

Если HSQLDB запускается встроенной без сервера, по определению она является частью процесса, который ее внедряет. Этот процесс может использовать несколько потоков для одновременного доступа к базе данных (например, к веб-серверу, такому как TOMEE, который включает HSQLDB). В развертывании со встроенным сервером без базы данных ни один другой процесс не может видеть базу данных.

Во всех режимах одновременно могут работать N писателей и M считывателей. Режим LOCKS блокирует таблицы для чтения и записи, но режим MVCC блокирует только обновленные строки.

Также возможно запустить сервер в процессе, который встраивает HSQLDB. Такой сервер обеспечивает доступ к другим процессам одновременно с процессом, внедряющим базу данных.

person fredt    schedule 28.05.2015
comment
большое спасибо. Когда в документации говорится, что он полностью многопоточный, означает ли это, что я просто выбираю модель транзакций (MVCC, LOCKS, MVLOCKS), а СУБД автоматически гарантирует, что многопоточное приложение не повредит целостность данных (во встроенном режиме)? И во-вторых, если он встроен (внутри процесса), но данные могут быть сохранены на диске, поэтому он использует блокировку файлов базы данных для других процессов? - person user4949624; 29.05.2015
comment
Да, вы выбираете модель TX, и она обеспечивает целостность данных, и да, она предотвращает подключение второго процесса к базе данных и повреждение файлов. - person fredt; 29.05.2015

Существует также встроенный MySQL, обычно считается, что он ведет себя легче для рабочей нагрузки чтения-частой записи-почти никогда, типичной для WWW, чем полномасштабные серверы, ориентированные на OLTP.

https://github.com/vorburger/MariaDB4j

Я не знаю, хорош этот проект или какая-то другая Java-изация.

person Arioch 'The    schedule 29.05.2015

Firebird 2.5 может быть вариантом для подхода с одним процессом и несколькими потоками.

Подходит ли Firebird для встроенной базы данных ASP.NET? Что еще?

Но вам придется сделать несколько подключений (по одному на поток)

Обновление: в Firebird 3 встроенный (внутрипроцессный) сервер (или несколько, если есть несколько процессов ОС, использующих встроенный сервер DLL/LIB.SO) и автономный сервер в классическом режиме (который в основном теперь является загрузчиком процессов ОС). встроенной dll) может работать одновременно с одним и тем же файлом базы данных. Однако автономный FB3 в режиме суперсервера блокирует файл базы данных для монопольного доступа.

person Arioch 'The    schedule 29.05.2015
comment
Спасибо. Встроенный Firebird — это встроенный сервер, верно? поэтому приложение подключается к встроенной базе данных и запускает другой серверный процесс, или встроенный сервер означает, что сервер работает в том же процессе, что и приложение? - person user4949624; 29.05.2015
comment
Сервер — это просто библиотека, которую вы загружаете в JVM. - person Arioch 'The; 29.05.2015
comment
база данных обычно представляет собой один файл, размещенный на том же компьютере, на котором работает сервер (автономный или встроенный в ваше приложение - без разницы) (требуется локальный доступ для создания эксклюзивных блокировок против других процессов, обращающихся к нему). движок основан на копировании при записи, поэтому блокировок при этом обычно не происходит; работа с данными, но некоторые коммиты могут быть отклонены из-за измененных данных, зафиксированных в другом потоке. Считается, что при типичной рабочей нагрузке этот оптимистичный подход без блокировки вызывает меньше коллизий, чем пессимистичный подход с блокировкой — все до единого. - person Arioch 'The; 29.05.2015