2010-07-16 3 views
9

Ich habe eine Multithread-Linux-C++ - Anwendung, die eine leistungsstarke Referenzdatensuche benötigt. Ich habe versucht, eine In-Memory-SQLite-Datenbank dafür zu verwenden, aber ich sehe keinen Weg, dies in meiner Multithread-Umgebung zu skalieren.Kann ich skalierbaren Multithread-Zugriff auf eine In-Memory-SQLite-Datenbank erreichen

Der standardmäßige Threading-Modus (serialisiert) scheint unter einer einzigen grobkörnigen Sperre zu leiden, auch wenn alle Transaktionen schreibgeschützt sind. Darüber hinaus glaube ich nicht, dass ich den Multi-Thread-Modus verwenden kann, da ich nicht mehrere Verbindungen zu einer einzigen In-Memory-Datenbank erstellen kann (weil jeder Aufruf von sqlite3_open (": memory:", & db) eine separate In-Memory-Datenbank erzeugt. Speicherdatenbank).

Also was ich wissen möchte ist: gibt es etwas, was ich in der Dokumentation verpasst habe und es ist möglich, mehrere Threads teilen Zugriff auf die gleiche In-Memory-Datenbank von meiner C++ - Anwendung.

Alternativ, gibt es eine Alternative zu SQLite, die ich in Betracht ziehen könnte?

Antwort

0

Nein, mit SQLite können Sie nicht aus verschiedenen Threads auf dieselbe In-Memory-Datenbank zugreifen. Das ist Absicht. Mehr Infos unter SQLite documentation.

+2

Da die Seite, auf die Sie verweisen, die einzige in der Dokumentation zu In-Memory-Datenbanken ist, ist es keine Überraschung, dass ich sie bereits gelesen habe.Es sagt nichts darüber aus, dass ich nicht auf mehrere Threads per Design zugreifen kann und tatsächlich funktioniert meine Anwendung problemlos aus mehreren Threads - sie skaliert einfach nicht, wenn ich Threads hinzufüge. – Fergus

+0

Willkommen zu Ihrer ersten Erwähnung! Es lohnt sich, dieses Glas Wein aufzuziehen, denke ich;) – mlvljr

6

Ja! siehe die aus der Dokumentation extrahiert Folgendes an: http://www.sqlite.org/inmemorydb.html

Aber es ist nicht eine direkte Verbindung zum DB-Speicher, anstatt auf die gemeinsam genutzten cache.Its eine Abhilfe. Siehe das Bild.

Multiple connections to SQLite in-memory DB by shared cache

In-Memory-Datenbanken und gemeinsam genutzten Cache

In-Memory-Datenbanken erlaubt sind Shared-Cache verwenden, wenn sie einen URI Dateinamen geöffnet verwenden. Wenn mit dem Namen ": memory:" die speicherinterne Datenbank angegeben wird, hat diese Datenbank immer einen privaten Cache und ist nur für die Datenbankverbindung sichtbar, die sie ursprünglich geöffnet hat. Allerdings kann die gleiche In-Memory-Datenbank, die von zwei oder mehr Datenbankverbindungen wie folgt geöffnet werden:

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

Oder

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

Dies ermöglicht eine getrennte Datenbankverbindungen die gleiche In-Memory-Datenbank zu teilen. Natürlich müssen alle Datenbankverbindungen, die sich die In-Memory-Datenbank teilen, im selben Prozess sein. Die Datenbank wird automatisch gelöscht und Speicher wird wiederhergestellt, wenn die letzte Verbindung zur Datenbank geschlossen wird.

Wenn zwei oder mehr unterschiedliche, aber gemeinsam nutzbare In-Memory-Datenbanken in einem einzigen Prozess benötigt werden, dann kann der Modus = Speicherabfrageparameter mit einem URI Dateinamen verwendet werden, um einen Namen in-Memory-Datenbank zu erstellen:

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

Oder

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

Wenn eine in-Memory-Datenbank auf diese Weise benannt ist, wird es nur seinen Cache mit einer anderen Verbindung teilen, die genau verwendet den gleichen Namen.