2010-07-16 17 views
9

Possiedo un'applicazione C++ Linux multi-thread che richiede una funzione di ricerca dei dati di riferimento ad alte prestazioni. Ho cercato di utilizzare un database SQLite in memoria per questo, ma non vedo un modo per farlo scalare nel mio ambiente multi-thread.È possibile ottenere un accesso multithreading scalabile a un database SQLite in memoria

La modalità di thread predefinita (serializzata) sembra soffrire di un singolo blocco a grana grossa anche quando tutte le transazioni sono di sola lettura. Inoltre, non credo di poter utilizzare la modalità multi-thread perché non riesco a creare più connessioni a un singolo database in memoria (perché ogni chiamata a sqlite3_open (": memory:", & db) crea un database di memoria).

Quindi quello che voglio sapere è: c'è qualcosa che ho perso nella documentazione ed è possibile avere più thread condividere l'accesso allo stesso database in memoria dalla mia applicazione C++.

In alternativa, c'è qualche alternativa a SQLite che potrei considerare?

risposta

0

No, con SQLite non è possibile accedere allo stesso database in memoria da thread diversi. Questo è di design. Maggiori informazioni allo SQLite documentation.

+2

Dato che la pagina di riferimento è l'unica nella documentazione sui database in memoria, non sorprende che l'abbia già letto.Non dice nulla sul fatto di non essere in grado di accedere da più thread in base alla progettazione e infatti la mia applicazione funziona bene da più thread - semplicemente non scala mentre aggiungo thread. – Fergus

+0

Benvenuti al primo aggiornamento! Vale la pena allevare quel bicchiere di vino, penso;) – mlvljr

6

Sì! vedere il seguente estratto dalla documentazione a: http://www.sqlite.org/inmemorydb.html

Ma la sua non un collegamento diretto alla memoria DB, invece alle cache.Its condivise una soluzione. guarda l'immagine

Multiple connections to SQLite in-memory DB by shared cache

in-memory database e cache condivisa

in-memory database sono autorizzati a utilizzare cache condivisa se sono aperti utilizzando un nome di file URI. Se il nome ": memory:" non ordinato viene utilizzato per specificare il database in memoria, quel database ha sempre una cache privata ed è visibile solo alla connessione al database che lo ha originariamente aperto. Tuttavia, lo stesso database in memoria può essere aperto da due o più connessioni al database come segue:

rc = sqlite3_open("file::memory:?cache=shared", &db); 

Oppure,

ATTACH DATABASE 'file::memory:?cache=shared' AS aux1; 

Questo permette connessioni al database separati di condividere lo stesso database in memoria. Naturalmente, tutte le connessioni database che condividono il database in memoria devono essere nello stesso processo. Il database viene automaticamente eliminato e la memoria viene recuperata quando si chiude l'ultima connessione al database.

Se due o più distinti ma condivisibile in-memory database sono necessari in un unico processo, allora il parametro mode = interrogazione memoria può essere utilizzato con un nome URI per creare un nome di database in-memory:

rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db); 

Oppure,

ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1; 

Quando un database in memoria è chiamato in questo modo, sarà solo condividere la cache con un altro collegamento che utilizza esattamente lo stesso nome.

Problemi correlati