2012-07-31 26 views
11

Okuma ve yazma iş parçacıkları arasında bağlantılar paylaşımı Veri depolamak için SQLite (sürüm 3.7.2) kullanan bir uygulama var. Aynı SQLite db'den yazan ve okuyan çok sayıda iş parçacığı arasında paylaşılan bir SQLite bağlantım var. SQLite, DSQLITE_THREADSAFE = 1 ile derlenmiştir; bu, SQLite'nin Seri hale getirilmiş modda olduğu anlamına gelir. Seri olarak SQLite docsSQLite:

gelen teklif

: seri modunda, SQLite güvenli bir şekilde herhangi bir sınırlama ile çarpanla mesajları kullanılabilir. Aksine

SQLite Wiki giriş diyor

O yumurtlar örnek bir uygulama ile çalıştı

birden bir iş parçacığı aynı anda aynı veritabanı bağlantısı kullanmayın yüzlerce iş parçacığı ve bir SQLite tanıtıcıyı & yazma işlevini okuyarak çalışıyor.

SQLite wiki girişi güncel değil veya SQLite aynı bağlantıyı kullanarak aynı anda farklı iş parçacıklarından okuma ve yazma işlemlerini gerçekleştiremeyebilir mi?

cevap

7

DÜZENLEME

DSQLITE_THREADSAFE = 2: Burada kullanılan "çok-ipli" SQLite'ta biraz karıştırılır çoklu iplik modu. Çoklu iş parçacığı modunda, başka bir iş parçacığı kullanıyorken bağlantıyı değiştirmek için bir iş parçacığının bağlantıyı önlemek için mutexes kullanamayacağından, diğer iş parçacıklarıyla bağlantı paylaşamazsınız.

DSQLITE_THREADSAFE = 1: tefrika modu Ancak tefrika modunda, bu veri dosyası kilitlenir ve paylaşılan bağlantı için erişimi denetlemek için muteksleri kullanacaktır.

Belgelerden: ... SQLite, SQLITE_THREADSAFE = 1 ile derlendiğinde, SQLite kütüphanesi, veritabanı bağlantılarına ve hazırlanmış deyimlere seri olarak serileştirilecek ve böylece uygulamanın aynı veritabanı bağlantısını veya aynı hazırlanmış ifadeyi kullanması serbest olacaktır Aynı anda farklı konularda. bağlantıları ile uğraşırken hala aynı veritabanına birden fazla bağlantı olabilse de

Yani, tefrika mod, evreli mod değil ama çok iplik.

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

Selamlar!Eğer varsa

+2

Bunu okudum, ancak wiki'nin eski olup olmadığını veya SQLite bağlantısının artık birden fazla ileti dizisinden aynı bağlantıdan 'reads' ve' yazmayı destekleyip desteklemediğini merak ediyordum? – omggs

+0

@omggs haklısınız. Bu terimler SQLite dokümanlarında biraz kafa karıştırıcıdır. Benim için * çok parçalı * ve * serileştirilmiş * aynıydı, ama değiller. Serileştirilmiş bağlantıları kullanıyorum ama iş parçacıkları arasında paylaşılmadım ... ve şimdi paylaşmanın güvenli olduğunu öğrendim :) – devundef

+1

Onaylama için teşekkürler! SQLite wiki gerçekten güncel değil! – omggs

0

Birden fazla iş parçacığı arasında bir bağlantı paylaşmak için kötü bir fikir DSQLITE_THREADSAFE = 0

1 bu kodu yürütülürken sizin İPLİK düşünün:

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

ve İPLİK 2 Bu yürütülürken aynı anda kodu:

Şimdi
1. connection.setAutoCommit(true); 

ne olur talimat İPLİK 2 1 tam İPLİK 1 talimatı 3 ÖNCE yürütülür? Muhtemelen bir "SQLException" mesajını "otomatik taahhüt modunda veritabanı" olarak alacaksınız (otomatik bağlantı yöntemleri aynı Bağlantı nesnesi üzerinde çalıştırıldığı için).

Bu seferki onun kod cevheri kullanım DSQLITE_THREADSAFE = 1

Eğer başka seçilmesine ilişkin karar zaman daha iyi performans alabilirsiniz hangi olacak geliştirmekten çoklu işlemli kodu iseniz de iyi olurdu bağlantı havuzu kullanma senkronize gerektiği anlamına gelir DBMS.