Posso leggere e scrivere su un database SQLite contemporaneamente da più connessioni?


89

Ho un database SQLite che viene utilizzato da due processi. Mi chiedo, con la versione più recente di SQLite, mentre un processo (connessione) avvia una transazione per scrivere sul database, l'altro processo sarà in grado di leggere dal database contemporaneamente?


domanda relativa vedere qui .. stackoverflow.com/questions/12117016/...
AndroidGeek

Risposte:


146

Ho raccolto informazioni da varie fonti, principalmente da sqlite.org, e le ho messe insieme:

Innanzitutto, per impostazione predefinita, più processi possono avere lo stesso database SQLite aperto contemporaneamente e più accessi in lettura possono essere soddisfatti in parallelo.

In caso di scrittura, una singola scrittura sul database blocca il database per un breve periodo, nulla, anche la lettura, può accedere al file del database.

A partire dalla versione 3.7.0, è disponibile una nuova opzione "Write Ahead Logging" (WAL) , in cui la lettura e la scrittura possono procedere contemporaneamente.

Per impostazione predefinita, WAL non è abilitato. Per attivare WAL, fare riferimento alla documentazione di SQLite.


quindi ipoteticamente se dovessi risolvere un problema in cui volevi i dati localmente senza renderli accessibili al pubblico in generale ma la possibilità di scrivere più file in parallelo, avrai bisogno di un file di database per tale scrittura in modo che più scritture possano avvenire contemporaneamente. è? So che più file di solito sono disapprovati, ma sto cercando di trovare un modo per eseguire più scritture da un'attività di sedano senza utilizzare un database lato server poiché ho bisogno dei dati solo per calcoli locali
PirateApp

Esiste un pragma, locking_mode = exclusive che può essere utilizzato per bloccare il database su un singolo processo, se si desidera impedire questa funzionalità.
Scovetta

20

SQLite3 consente esplicitamente più connessioni :

(5) Più applicazioni o più istanze della stessa applicazione possono accedere a un singolo file di database contemporaneamente?

Più processi possono avere lo stesso database aperto contemporaneamente. Più processi possono eseguire una SELEZIONE contemporaneamente. Tuttavia, solo un processo può apportare modifiche al database in qualsiasi momento.

Per la condivisione delle connessioni, utilizza la cache condivisa SQLite3 :

A partire dalla versione 3.3.0, SQLite include una speciale modalità "cache condivisa" ( disabilitata per impostazione predefinita )

Nella versione 3.5.0, la modalità cache condivisa è stata modificata in modo che la stessa cache possa essere condivisa attraverso un intero processo anziché solo all'interno di un singolo thread.

5.0 Abilitazione della modalità cache condivisa

La modalità cache condivisa è abilitata in base al processo. Utilizzando l'interfaccia C, è possibile utilizzare la seguente API per abilitare o disabilitare globalmente la modalità cache condivisa:

int sqlite3_enable_shared_cache (int);

Ogni chiamata sqlite3_enable_shared_cache () ha effetto sulle successive connessioni al database create utilizzando sqlite3_open (), sqlite3_open16 () o sqlite3_open_v2 (). Le connessioni al database già esistenti non sono interessate. Ogni chiamata a sqlite3_enable_shared_cache () sovrascrive tutte le chiamate precedenti all'interno dello stesso processo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.