2012-07-31 16 views
11

Ho un'applicazione che utilizza SQLite (versione 3.7.2) per memorizzare i dati. Ho una connessione SQLite condivisa tra più thread che scrive e legge dallo stesso SQLite db. SQLite è compilato con DSQLITE_THREADSAFE = 1 che significa che SQLite è in modalità serializzata.SQLite: condivisione di connessioni tra thread per leggere e scrivere

Citando SQLite docs

Serialized: In modalità serializzato, SQLite può essere utilizzato in modo sicuro da multipli fili senza alcuna restrizione.

Al contrario l'entrata SQLite Wiki dice

Non usare la stessa connessione al database, allo stesso tempo in più di un thread

ho provato con un'applicazione di esempio che genera centinaia di thread e condivide un handle SQLite per leggere & scrivere che funziona correttamente.

Quindi la voce del wiki SQLite obsoleta o SQLite potrebbe non essere in grado di gestire la lettura e la scrittura che si verificano da thread diversi allo stesso tempo utilizzando la stessa connessione?

risposta

7

EDIT

DSQLITE_THREADSAFE = 2: modalità multi-thread Il termine "multi-thread" è un po 'confuso in SQLite. Sembra in modalità Multi-thread non è possibile condividere una connessione con altri thread perché la connessione stessa non utilizzerà mutex per impedire a un thread di modificare la connessione mentre un altro thread lo sta usando.

DSQLITE_THREADSAFE = 1: modalità serializzato Tuttavia, in modalità serializzato, si blocca il file di dati e userà mutex per controllare l'accesso per la connessione condivisa.

Da doc: ... quando SQLite è compilato con SQLITE_THREADSAFE = 1, la libreria SQLite eseguirà automaticamente la serializzazione dell'accesso alle connessioni del database e alle istruzioni preparate in modo che l'applicazione sia libera di utilizzare la stessa connessione al database o la stessa istruzione preparata in diversi thread allo stesso tempo.

Così, quando si tratta di collegamenti, modalità serializzato è thread-safe, mamulti-thread in modalità non è, anche se è ancora possibile avere più connessioni allo stesso database.

Fonte: http://www.sqlite.org/c3ref/c_config_getmalloc.html#sqliteconfigmultithread

saluti!

+2

Ho letto che, ma mi chiedevo se la wiki fosse obsoleta o la connessione SQLite ora supporta 'reads' e' scrive' dalla stessa connessione da più thread? – omggs

+0

@omggs hai ragione. I termini sono un po 'di confusione nei documenti SQLite. Per me * multi-thread * e * serialized * erano uguali, ma non lo sono. Uso le connessioni serializzate ma non le condivido tra i thread ... e ora ho imparato che è sicuro condividere :) – devundef

+1

Grazie per la conferma! Il wiki SQLite è davvero obsoleto !!! – omggs

0

E 'una cattiva idea di condividere una connessione tra più di un thread quando si hanno DSQLITE_THREADSAFE = 0

Immagina il tuo thread 1 viene eseguito il codice:

1. connection.setAutoCommit(false); 
2. statement.executeUpdate(sql); 
3. connection.commit(); 

e il tuo thread 2 è l'esecuzione di questo il codice allo stesso tempo:

1. connection.setAutoCommit(true); 

Ora, cosa succede se l'istruzione 1 di filo 2 viene eseguita esattamente PRIMA istruzioni 3 di filo 1? Probabilmente riceverai una SQLException con il messaggio "database in modalità auto-commit" (poiché i metodi di commit automatico vengono eseguiti sullo stesso oggetto Connection).

Questo significa che si dovrebbe sincronizzare il suo codice uso minerale DSQLITE_THREADSAFE = 1

Utilizzando il pool di connessioni sarebbe anche il migliore se hai intenzione di codice develope multithread da cui è possibile ottenere prestazioni migliori quando si decide di optare per un altro DBMS.

Problemi correlati