İki python işlemine sahip SQLite buna erişiyor: bir okuma, bir yazma


22

İki bileşenli küçük bir sistem geliştiriyorum: Biri bir internet kaynağından veri toplar ve yerel olarak sürdürmek için sql verisine çevirir; İkincisi, bu sql verilerini yerel durumdan okur ve ona json ve dinlendirici bir api aracılığıyla sunar.

Başlangıçta postgresql ile verileri sürdürmeyi planlamıştım, ancak uygulamanın depolanacak çok düşük bir veri hacmi ve hizmet verecek trafik alacağı için, bunun fazla pişmiş olduğunu düşündüm. SQLite işe kalmış mı? Küçük ayak izi fikrini seviyorum ve bu görev için başka bir sql sunucusu sağlamaya gerek yok, ancak eşzamanlılık konusunda endişeliyim.

Önceden günlüğe kaydetme günlüğü etkinken, aynı anda bir SQLite veritabanını okumak ve yazmak, veritabanından herhangi bir işlemi kilitlemeden gerçekleşebilir gibi görünüyor.

Tek bir SQLite örneği, yalnızca biri okuyup diğeri yazarsa, ona erişen iki eşzamanlı işlemi devam ettirebilir mi? Kodu yazmaya başladım ama bunun bir SQLite yanlış uygulaması olup olmadığını merak ediyordum.


3
@gnat Cool. Tek bir SQLite örneği, yalnızca biri okuyup diğeri yazarsa, ona erişen iki eşzamanlı işlemi devam ettirebilir mi? Kodu yazmaya başladım ama bunun bir SQLite yanlış uygulaması olup olmadığını merak ediyordum.
bb

Sadece bir kafa yukarı. Önceki şirketimde, bazı depolama için SQL (hem MS hem de Oracle Express) kullanıyorduk ve ne kadar az depoda olduğumuzu tam bir DB'ye ihtiyaç duymadığımızı hissettik. Bu yüzden bültenlerden birinde tam olarak ne yapıyorsanız yapmaya karar verdik. Bu ürünleri SQLite ile değiştirin. Tam olarak aynı şeyi yaptık, bir veriyi disk üzerinde bırakacak ve SQL tabanlı TOC'yi ve okuyucu sürecini (çoklu iş parçacıkları) güncelleyecek olan ve hangi veriyi alacağını belirlemek için TOC'yi okuyacak olan bir yazarımız vardı. Bugünlerde SQLite hakkında bir şey bilmiyorum, ama ne kadar eşzamanlılık
yaşadığımız

... arkasından. Tüm ayrıntıları hatırlamıyorum, ancak bir işlem kilitlenmeye çalıştığında ve bir başkasının okuduğu için yapamadığı zaman, 20-30 saniye gibi çılgınca bir şey için UYKU olacağını düşünüyorum. SQLite erişiminden sorumlu olan özel bir iş parçacığı oluşturduk ve sonra hem işlemlerimizi hem de içlerindeki tüm iş parçacıklarını DB isteklerini bu iş parçacığına göre diziledik. Gezerken, muhtemelen tekrar SQLite ile gitmezdim.
DXM

1
@DXM uyarı için teşekkürler, ancak birkaç test yaptıktan sonra benzer bir şeyle karşılaşmadım. Sqlite'ın 2004 yılındaki sürüm 3 ile büyük bir revizyona girdiğini biliyorum, bu yüzden olumsuz tecrübenizin o zamandan önce olup olmadığını merak ediyorum.
bb

1
... SQLite'nin kilitleme planlarına güvenmek yerine, kendiniz. İşi kendim yapmadım, başka bir takım daha vardı ama geri bildirimde bulunmak ve meraktan kurtulmak için döngüde kaldım. Ayrıca çevrimiçi oldum ve biraz bağımsız okuma yaptım ve orijinal yazarın sayfasını buldum. Bunu okuduğumda, SQLite mucidinin basitçe konudan nefret ettiği ve neden birinin kullandığını göremediği izlenimini edindim, bu yüzden a) DB kendileri için tasarlanmamıştır ve b) kilitler / koruma biraz eklenmiş / bir düşünce olarak saldırdı, çünkü çok fazla insan istedi.
DXM

Yanıtlar:


25

Dosya Kilitleme ve Eşzamanlılık belgeleri için arıyorsunuz .

SQLite işlemleri eşzamanlılığı işlemek için bir dizi kilit kullanır; okumak için birkaç işlem bir SHAREDkilit elde edebilir .

Yazan, RESERVEDkilitlenen bir işlem gerekir ve yalnızca diske yapılan değişiklikleri gerçekten yıkamak zorunda kaldığında PENDINGduruma geçer. Herhangi bir okuma işleminin daha sonra dosyanın kilidini açması gerekir, bundan sonra yazma işlemi EXCLUSIVEgerçek veritabanı dosyasına yazılabilir.

Yazar işleminin sadece gerçek yazma işlemleri için veritabanı dosyasını kilitlemesi gerektiğinden (bellek temizler, taahhüt eder), sadece bir okuyucu ve sadece bir yazar içeren bir kurulum oldukça iyi sonuç verecektir. Tüm okuma ve yazmayı tek bir işlemle yapmanın daha iyi olmasa da aynı performansı göstermesini beklerdim.

SQLite, aynı veritabanına sık sık yazılan birden fazla işleminiz olduğunda, yazma işlemi PENDINGdeğişiklikleri seri hale getirmek için özel kilit elde edilmesini gerektirdiğinden daha az uygundur .


Tam cevap için teşekkürler Martijn! Bazı testler yapmak için bazı senaryolar yazdım ve iki işlem aynı anda mutlu bir şekilde tek bir sqlite örneği okuyacak ve yazacak gibi görünüyor. Bir saniyenin 1 / 100'ünde bir ateşleme eşzamanlı okuma ve yazma isteği yapıyordum ve hala kilitli bir db istisnası alamadım. Garip bir şekilde, bir "veritabanı kilitli" hata mesajını aldığım tek zaman el ile (sqlite3 komut satırı istemcisiyle) bir kaç satır silmek istediğimde okuma istekleri saniyenin 1 / 100'ünde senaryomdan çıkarılıyordu. Acaba pysql böyle bir hatadan sonra otomatik olarak bir yazı yazmayı deniyor mu?
bb

10

Sadece takip etmek ve uygulamanın başarılı olduğunu herkesin bilmesini istedim. SQLite ile çalışmak gerçek bir zevkti ve bir seferde sadece bir işlem yazarken hiçbir zaman kilitlenme ile ilgili sorun yaşamadık ... ikincil bir işlemden aynı anda çok hızlı okumalar bile.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.