Czy mogę jednocześnie odczytywać i zapisywać w bazie danych SQLite z wielu połączeń?


87

Mam bazę danych SQLite używaną przez dwa procesy. Zastanawiam się, czy przy najnowszej wersji SQLite, podczas gdy jeden proces (połączenie) rozpoczyna transakcję zapisu do bazy danych, czy drugi proces będzie mógł jednocześnie czytać z bazy danych?


powiązane pytanie patrz tutaj .. stackoverflow.com/questions/12117016/…
AndroidGeek

Odpowiedzi:


142

Zebrałem informacje z różnych źródeł, głównie z sqlite.org, i złożyłem je razem:

Po pierwsze, domyślnie wiele procesów może mieć otwartą tę samą bazę danych SQLite w tym samym czasie, a kilka dostępów do odczytu może być obsługiwanych równolegle.

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

Począwszy od wersji 3.7.0, dostępna jest nowa opcja Zapisywanie z wyprzedzeniem w dzienniku ” (WAL) , w której odczyt i zapis może odbywać się jednocześnie.

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


więc hipotetycznie, gdybyś musiał rozwiązać problem polegający na tym, że chciałeś mieć dane lokalnie, bez udostępniania ich ogółowi społeczeństwa, ale z możliwością równoległego zapisu wielu plików, będziesz potrzebował jednego pliku bazy danych na taki zapis, aby wiele zapisów mogło mieć miejsce jednocześnie. czy to jest Wiem, że wiele plików jest zwykle
źle widzianych,

Istnieje pragma, lock_mode = exclusive, którego można użyć do zablokowania bazy danych w pojedynczym procesie, jeśli chcesz zapobiec tej funkcjonalności.
Scovetta

20

SQLite3 jawnie zezwala na wiele połączeń :

(5) Czy wiele aplikacji lub wiele instancji tej samej aplikacji może mieć dostęp do jednego pliku bazy danych w tym samym czasie?

Wiele procesów może mieć otwartą tę samą bazę danych w tym samym czasie. WYBÓR może wykonywać jednocześnie wiele procesów. Jednak tylko jeden proces może wprowadzać zmiany w bazie danych w dowolnym momencie.

Do udostępniania połączeń użyj udostępnionej pamięci podręcznej SQLite3 :

Począwszy od wersji 3.3.0, SQLite zawiera specjalny tryb „Shared-Cache” ( domyślnie wyłączony )

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 w jednym wątku.

5.0 Włączanie trybu współdzielonej pamięci podręcznej

Tryb współdzielonej pamięci podręcznej jest włączany dla każdego procesu. Korzystając z interfejsu C, można użyć następującego interfejsu API do globalnego włączania lub wyłączania trybu współdzielonej pamięci podręcznej:

int sqlite3_enable_shared_cache (int);

Każde wywołanie sqlite3_enable_shared_cache () wpływa na kolejne połączenia z bazą danych utworzone za pomocą funkcji sqlite3_open (), sqlite3_open16 () lub sqlite3_open_v2 (). Nie ma to wpływu na istniejące już połączenia z bazą danych. Każde wywołanie sqlite3_enable_shared_cache () przesłania wszystkie poprzednie wywołania w ramach tego samego procesu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.