2012-04-26 12 views
44

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

+0

domanda correlata, vedere qui .. http: // stackoverflow.it/questions/12117016/strategies-for-concurrent-read-writing-and-reading-in-sqlite/24038860 # 24038860 – Nepster

risposta

76

ho raccolto informazioni da varie fonti, per lo più da sqlite.org, e metterli insieme:

In primo luogo, per impostazione predefinita, più processi possono avere lo stesso database SQLite aperto allo stesso tempo, e diversi accessi di lettura può essere soddisfatto in parallelo.

In caso di scrittura, una singola scrittura nel database blocca il database per un breve periodo di tempo, nulla, nemmeno 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.

+0

journal_mode = WAL risolve il mio problema! –

11

SQLite3 permette esplicitamente multiple connections:

(5) Can più applicazioni o più istanze dello stesso accesso alle applicazioni un singolo file di database, allo stesso tempo?

Più processi possono avere lo stesso database aperto allo stesso tempo. È possibile che più processi eseguano un SELEZIONA allo stesso tempo. Ma solo un processo può apportare modifiche al database in qualsiasi momento nell'ora , tuttavia.

Per i collegamenti di condivisione, utilizzare SQLite3 shared cache:

A partire dalla versione 3.3.0, SQLite include uno speciale "shared-cache" modalità (disabilitato per default)

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

5.0 Abilitazione Shared-Cache Modalità

modalità condivisa-cache è attivata su una base per-processo. Utilizzando l'interfaccia C , è possibile utilizzare la seguente API per attivare o disattivare globalmente la modalità cache condivisa :

int sqlite3_enable_shared_cache (int);

Ogni sqlite3_enable_shared_cache chiamata() effetti successivo del database connessioni create utilizzando sqlite3_open(), sqlite3_open16(), o sqlite3_open_v2(). Le connessioni al database che esistono già sono inalterate. Ogni chiamata a sqlite3_enable_shared_cache() sovrascrive tutte le chiamate precedenti allo all'interno dello stesso processo.

Problemi correlati