Spec-Zone.ru › SQLite

Использование SQLite в многопоточных приложениях

1. Обзор

SQLite поддерживает три различных режима многопоточности:

  1. Однопоточный. В этом режиме все мьютексы отключены, и SQLite небезопасно использовать в более чем одном потоке одновременно.

  2. Многопоточный. В этом режиме SQLite можно безопасно использовать несколькими потоками при условии, что ни одно отдельное соединение с базой данных, ни какой-либо объект, производный от соединения с базой данных, например, предзаготовленный запрос, не используется в двух или более потоках одновременно.

  3. Сериализованный. В режиме сериализации вызовы API для воздействия или использования любого SQLite соединения с базой данных или любого объекта, производного от такого соединения с базой данных, можно безопасно выполнять из нескольких потоков. Эффект на отдельный объект такой же, как если бы все вызовы API были выполнены в том же порядке из одного потока. Название «сериализованный» происходит из того факта, что SQLite использует мьютексы для сериализации доступа к каждому объекту.

Режим многопоточности может быть выбран во время компиляции (когда библиотека SQLite компилируется из исходного кода), во время запуска (когда приложение, которое собирается использовать SQLite, инициализируется) или во время выполнения (когда создается новое соединение с базой данных SQLite). В общем случае, режим, выбранный во время выполнения, переопределяет режим, выбранный во время запуска, а режим, выбранный во время запуска, переопределяет режим, выбранный во время компиляции. Исключением является режим однопоточной работы, который нельзя переопределить после выбора.

По умолчанию используется режим сериализации.

2. Выбор режима многопоточности во время компиляции

Используйте параметр компиляции SQLITE_THREADSAFE для выбора режима многопоточности. Если параметр компиляции SQLITE_THREADSAFE отсутствует, используется режим сериализации. Это можно сделать явно с помощью -DSQLITE_THREADSAFE=1. С помощью -DSQLITE_THREADSAFE=0 режим многопоточности устанавливается в однопоточный. С помощью -DSQLITE_THREADSAFE=2 режим многопоточности устанавливается в многопоточный.

Значение возвращаемое интерфейсом sqlite3_threadsafe() — это значение SQLITE_THREADSAFE, заданное во время компиляции. Оно не отражает изменения режима многопоточности, сделанные во время выполнения с помощью интерфейса sqlite3_config() или флагов, переданных в качестве третьего аргумента к sqlite3_open_v2().

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

3. Выбор режима многопоточности во время запуска

Предполагая, что режим многопоточности во время компиляции не является однопоточным, то режим многопоточности можно изменить во время инициализации, используя интерфейс sqlite3_config(). Использование SQLITE_CONFIG_SINGLETHREAD устанавливает режим однопоточной работы, SQLITE_CONFIG_MULTITHREAD устанавливает многопоточный режим, а SQLITE_CONFIG_SERIALIZED устанавливает режим сериализованной работы.

4. Выбор режима многопоточности во время выполнения

Если режим однопоточной работы не был выбран во время компиляции или запуска, то отдельные соединения с базой данных могут быть созданы как многопоточные или сериализованные. Невозможно понизить отдельный объект соединения с базой данных до однопоточного режима. Также невозможно повысить отдельный объект соединения с базой данных, если режим во время компиляции или запуска — однопоточный.

Режим многопоточности для отдельного соединения с базой данных определяется флагами, переданными в качестве третьего аргумента к sqlite3_open_v2(). Флаг SQLITE_OPEN_NOMUTEX устанавливает режим многопоточности для соединения с базой данных, а флаг SQLITE_OPEN_FULLMUTEX устанавливает режим сериализованной работы. Если ни один из флагов не указан или если используются sqlite3_open() или sqlite3_open16() вместо sqlite3_open_v2(), то используется режим по умолчанию, определенный настройками во время компиляции и запуска.

Эта страница была последняяжды изменена 05.12.2023 14:43:20 UTC

SQLite is in the Public Domain.
https://sqlite.org/threadsafe.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API