2012-04-26 10 views
44

Mam bazę danych SQLite, która jest używana przez dwa procesy. Zastanawiam się, z najnowszą wersją SQLite, podczas gdy jeden proces (połączenie) uruchamia transakcję do zapisu do bazy danych, czy drugi proces będzie mógł jednocześnie odczytać z bazy danych?Czy mogę czytać i zapisywać dane w bazie danych SQLite jednocześnie z wielu połączeń?

+0

powiązane pytanie zobacz tutaj .. http: // stackoverflow.com/questions/12117016/strategy-for-concurrent-read-writing-and-reading-in-sqlite/24038860 # 24038860 – Nepster

Odpowiedz

76

Zebrałem informacje z różnych źródeł, głównie z sqlite.org, i umieścić je razem:

pierwsze domyślnie wiele procesów może mieć tę samą bazę danych SQLite otwarte w tym samym czasie, a może kilka odczytu dostępy być spełnione równolegle.

W przypadku zapisu pojedynczy zapis do bazy danych blokuje bazę danych przez krótki czas, w ogóle nic, nawet odczyt, nie ma dostępu do pliku bazy danych.

Począwszy od wersji 3.7.0 dostępna jest nowa opcja “Write Ahead Logging” (WAL), w której czytanie i pisanie może być wykonywane jednocześnie.

Domyślnie WAL nie jest włączona. Aby włączyć WAL, zapoznaj się z dokumentacją SQLite.

+0

journal_mode = WAL rozwiązuje mój problem! –

11

SQLite3 wyraźnie pozwala multiple connections:

(5) Czy wiele aplikacji lub wiele instancji tego samego dostępu do pojedynczego pliku bazy danych w tym samym czasie aplikacji?

Wiele procesów może otwierać tę samą bazę danych w tym samym czasie. Wiele procesów może wykonywać SELECT w tym samym czasie. Jednak tylko jeden proces może wprowadzać zmiany w bazie danych w dowolnym momencie w czasie .

do współdzielenia połączeń, należy SQLite3 shared cache:

Począwszy od wersji 3.3.0, SQLite obejmuje tryb specjalny "współdzielony-cache" (domyślnie wyłączone)

w wersji 3.5.0, tryb współużytkowanej pamięci podręcznej został zmodyfikowany, aby ta sama pamięć podręczna mogła być współużytkowana w całym procesie, a nie tylko wewnątrz pojedynczego wątku .

5.0 Włączanie Shared-Cache Tryb

tryb wspólna-cache jest włączona dla poszczególnych procesów. Za pomocą interfejsu C można użyć następującego interfejsu API do globalnego włączenia lub wyłączenia trybu wspólnej pamięci podręcznej:

int sqlite3_enable_shared_cache (int);

Każdy sqlite3_enable_shared_cache call() efekty kolejnych baz połączenia utworzone za pomocą sqlite3_open(), sqlite3_open16() lub sqlite3_open_v2(). Połączenia bazy danych, które już istnieją, są niezmienione. Każde wywołanie sqlite3_enable_shared_cache() zastępuje wszystkie poprzednie wywołania w ramach tego samego procesu.

Powiązane problemy