2010-07-16 14 views
9

Yüksek performanslı bir referans veri arama özelliğine ihtiyaç duyan çok iş parçacıklı bir Linux C++ uygulamasına sahibim. Bunun için bir bellek içi SQLite veritabanını kullanmayı düşünüyordum, ancak bunu çok iş parçacıklı ortamımda ölçeklendirmenin bir yolunu göremiyorum.Bir bellek içi SQLite veritabanına ölçeklenebilir çok iş parçacıklı erişim sağlayabilir miyim

Varsayılan işlem modu (serileştirilmiş), yalnızca tüm işlemler okunduğunda bile tek bir kaba taneli kilitten muzdarip gibi görünüyor. Üstelik, çoklu-thread modunu kullanabileceğime inanmıyorum çünkü tek bir bellek içi veri tabanına birden fazla bağlantı oluşturamıyorum (çünkü her çağrıya sqlite3_open (": bellek:", & db) ayrı bir bellek veritabanı).

Öyleyse bilmek istediğim: belgelerinde kaçırdığım bir şey var ve birden çok ileti dizisinin C++ uygulamamdaki aynı bellek içi veritabanına erişimini paylaşması mümkün.

Alternatif olarak, düşündüğüm SQLite'ye alternatif var mı?

cevap

0

Hayır, SQLite ile farklı iş parçacıklarından aynı bellek içi veritabanına erişemezsiniz. Bu tasarım gereğidir. Daha fazla bilgi için SQLite documentation.

+2

Referans verdiğiniz sayfa, bellek içi veritabanlarındaki belgelerin yalnızca bir tanesidir, bunu zaten okumam hiç şaşırtıcı değil.Tasarımla birden çok ileti dizisinden erişememeyle ilgili hiçbir şey söylemiyor ve aslında uygulamam çok sayıda iş parçacığından gayet iyi çalışıyor. – Fergus

+0

İlk Deflonuza Hoş Geldiniz! Bu kadeh şarabın yetiştirilmeye değer olduğunu düşünüyorum;) – mlvljr

6

Evet! de belgelere çıkarılan aşağıdaki bkz: yerine paylaşılan cache.Its geçici bir çözüm için, http://www.sqlite.org/inmemorydb.html

Ama DB belleğe onun değil doğrudan bağlantı. resme bakın.

Multiple connections to SQLite in-memory DB by shared cache

Bellek içi Veritabanları Ve veritabanları bir URI dosya adını kullanarak açılan eğer paylaşılan önbellek kullanmasına izin verilir ise bellek

Paylaşılan Önbellek. Bellek içi veritabanını belirtmek için, kullanılmayan ": bellek:" adı kullanılırsa, bu veritabanının her zaman özel bir önbelleği vardır ve bu yalnızca orijinal olarak açılan veritabanı bağlantısında görünür. aşağıdaki gibi Ancak, aynı bellek içi veri tabanı iki veya daha fazla veritabanı bağlantıları açılabilir:

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

Veya,

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

Bu ayrı veritabanı bağlantıları aynı bellek içi veri tabanını paylaşmalarını sağlar. Tabii ki, bellek içi veritabanını paylaşan tüm veritabanı bağlantılarının aynı süreçte olması gerekir. Veritabanı otomatik olarak silinir ve veritabanına son bağlantı kapatıldığında bellek geri alınır.

ise daha farklı fakat bellek veri tabanları daha sonra mode = Bellek sorgu parametresi adlandırılmış bellek veri tabanı oluşturmak için bir tanım dosya adı ile kullanılabilir, tek bir işlem ihtiyaç vardır paylaşılabilir iki ya:

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

Veya, bir bellek içi veri tabanı bu şekilde adlandırılır

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

, sadece tam olarak aynı adı kullanan başka bir bağlantı ile önbelleğini paylaşacak.

İlgili konular