2010-07-09 12 views
5

Ludzie Wprowadzam kolejkę opartą na plikach (see my earlier question) przy użyciu sqlite. Mam następujące wątki działa w tle:sqlite database connection/locking question

  1. wątku 1, aby opróżnić strukturę pamięci do tabeli "kolejka" (wstawić do tabeli "kolejka").
  2. wątek-1 do odczytu i "przetwarzania" tabeli "kolejki" działa co 5 do 10 sekund
  3. wątek-3 - działa bardzo rzadko i usuwa stare dane, które nie są już potrzebne z tabeli "kolejka", a także działa podciśnienie, więc rozmiar pliku bazy danych pozostaje mały.

Teraz zachowanie, które chciałbym, jest dla każdego wątku, aby uzyskać wszelkie blokady, których potrzebuje (czekanie z przekroczeniem limitu czasu, jeśli to możliwe), a następnie dokończenie transakcji. Jest ok, jeśli wątki nie działają jednocześnie - ważne jest to, że transakcja raz się nie zawiedzie z powodu "blokowania" błędów, takich jak "baza danych jest zablokowana".

Spojrzałem na transaction documentation, ale nie wydaje się, że jest to "limit czasu" (używam JDBC). Czy limit czasu może być ustawiony na dużą ilość w połączeniu?

Jedno rozwiązanie (niesprawdzone), które mogę wymyślić, to mieć pulę połączeń maksymalnie 1 połączenia. Tak więc tylko jeden wątek może się łączyć na raz, więc nie powinniśmy widzieć żadnych błędów blokowania. Czy są lepsze sposoby?

Thanx!

Odpowiedz

2

Gdyby to był ja, użyłbym pojedynczego połączenia z bazą danych. Jeśli wątek tego potrzebuje, może go przydzielić w krytycznej sekcji (lub muteksie lub podobnym) - jest to w zasadzie pula połączeń biedaka z tylko jednym połączeniem w puli :) Może ona wykonywać swoją działalność za pomocą bazy danych. Po zakończeniu wychodzi z sekcji krytycznej (lub zwalnia muteks lub?). Nie uzyskasz błędów blokowania, jeśli będziesz ostrożnie korzystać z połączenia db.

-Don

+0

Niż Don, to co mogę skończyć chociaż robi to poprzez ustawienie puli db byłoby bardziej „standardowy” sposób to zrobić (i mniej kłopotliwe, ponieważ jesteś traktując SQLite jak innych baz danych w kodzie. – serverman