RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.
Применение SQLite в мультипоточных приложениях

1. Обзор

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

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

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

  3. Serialized. В преобразованном в последовательную форму способе вызовы API, чтобы управлять SQLite любое соединение с БД или любой объект, полученный из соединения с базой данных, могут быть использованы безопасно из многократных потоков. Эффект на отдельный объект совпадает с тем, как если бы вызовы API были все сделаны в том же самом порядке от единственного потока. Имя "преобразованный в последовательную форму" является результатом того, что SQLite использует mutexes, чтобы преобразовать в последовательную форму доступ к каждому объекту.

Способ может быть отобран во время компиляции (когда библиотека SQLite собирается из исходного кода), во время запуска (когда применение, которое намеревается использовать SQLite, инициализируется) или во время выполнения (когда новое соединение с базой данных SQLite создается). Вообще говоря, время выполнения отвергает время запуска, а оно отвергает время компиляции. Кроме того, single-thread не может быть отвергнут.

Режим по умолчанию serialized.

2. Выбор времени компиляции

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

Возвращаемое значение sqlite3_threadsafe() это значение SQLITE_THREADSAFE, заданное во время компиляции. Это не отражает изменения способа потоков, сделанного во время выполнения через sqlite3_config() или флагами, данными как третий аргумент sqlite3_open_v2().

Если выбран single-thread при сборке, то критическая логика mutex опущена, и невозможно позволить multi-thread или serialized во время запуска или выполнения.

3. Выбор во время запуска

Предполагая, что способ времени компиляции не single-thread, способ работы потоков может быть изменен во время инициализации, используя sqlite3_config(). SQLITE_CONFIG_SINGLETHREAD помещает SQLite в режим single-thread, SQLITE_CONFIG_MULTITHREAD в multi-thread, а SQLITE_CONFIG_SERIALIZED в serialized.

4. Выбор во время выполнения

Если single-thread не был отобран во время компиляции или запуска, то отдельные соединения с базой данных могут быть созданы как multi-thread или serialized. Невозможно понизить отдельное соединение с базой данных до single-thread. При этом невозможно нарастить отдельное соединение с базой данных, если способ времени компиляции или времени запуска single-thread.

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