2010-07-09 22 views
5

millet sqlite kullanarak bir dosya tabanlı sıra (see my earlier question) uygularım. Arka planda çalışan aşağıdaki konuları sahiptir:sqlite veritabanı bağlantısı/kilitleme sorusu

  1. iplik 1 "sıra" tablosu ("sıra" tablosuna bir uç) bir bellek yapısını boşaltmak için.
  2. parçacığı 1 okunması ve "süreç" "kuyruk" tablosu her 5 ila 10 saniyede koşuyor
  3. iplik-3 - çok seyrek çalışır ve tasfiyeler "kuyruk" masa ve ayrıca, gerektiğinde artık eski verileri Boşluk çalıştırır, böylece veritabanı dosyasının boyutu küçük kalır.

Şimdi istiyorum davranış her iplik ihtiyacı ne olursa olsun kilit almak için (zaman aşımı mümkünse bekleyen) ve daha sonra işlemi tamamlamadan olduğunu. İş parçacığı eşzamanlı olarak çalışmazsa sorun yoktur - önemli olan, işlemin bir kez başlatılmasının "veritabanı kilitli" gibi "kilitleme" hataları nedeniyle başarısız olmamasıdır.

transaction documentation'a baktım ama bir "zaman aşımı" özelliği yok gibi görünüyor (JDBC kullanıyorum). Zaman aşımı bağlantıda büyük miktarda ayarlanmış olabilir mi?

Tek bir çözüm (denenmemiş) Maksimum 1 bağlantı bir bağlantı havuzuna sahip olmak düşünebilirsiniz. Böylece bir seferde sadece bir iplik bağlanabilir ve bu nedenle herhangi bir kilitleme hatası görmemeliyiz. Daha iyi yollar var mı?

Thanx!

cevap

2

Ben olsaydım, tek bir veritabanı bağlantı tanıtıcısı kullanırdım. Bir iş parçacığının buna ihtiyacı varsa, bunu kritik bir bölüm (veya muteks veya benzeri) içinde tahsis edebilir - bu temelde havuzdaki tek bir bağlantı ile fakir bir adamın bağlantı havuzudır :) İşini veritabanında yapabilir. Tamamlandığında, kritik bölümden çıkar (veya muteks veya?). Tek db bağlantısını dikkatli kullanırsanız, kilitleme hataları almayacaksınız.

-Don

+0

Thanx Don, bu bir db havuzu aracılığıyla ayarlama diğer veritabanları gibi sqlite davranıyorlar çünkü (ve daha az kafa karıştırıcı yapmanın daha "standart" bir yol olacağını olsa yapıyor sonunda olabilir ne kodda. – serverman