Sqlite wiele wątków.

Sqlite wiele wątków.
WI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 148
0

Dzień dobry czy w sqlite jest jakies ograniczenie połączonych wątków z bazą w trybie wal(jeden zapis i dużo odczytów jednocześnie)? Czy to tylko kwestia ramu dla cache size i podobnych pochodnych?

WI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 148
0

@Riddle:
Dziękuję nie do końca o to pytam. (Może źle się wyraziłem).
Czy są jakieś ograniczenia systemu albo sqlite3 co do samego otwarcia pliku przez różne wątki w tym samym procesie ale kontrolujące by tylko jeden mógł naraz zapisywać. (Wszystko w trybie WAL).
Obecnie mam taki program i działa bardzo dobrze do 200 wątków(każdy ma osobne połączenie). Te wątki obsługują połączenia tcp/ip z innymi moimi programami. Ciężko jest mi skalować wykonać resty ponad 200 aplikacji klienckich czyli w sumie 200 wątków.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0
Windowbee napisał(a):

@Riddle:
Dziękuję nie do końca o to pytam. (Może źle się wyraziłem).
Czy są jakieś ograniczenia systemu albo sqlite3 co do samego otwarcia pliku przez różne wątki w tym samym procesie ale kontrolujące by tylko jeden mógł naraz zapisywać. (Wszystko w trybie WAL).
Obecnie mam taki program i działa bardzo dobrze do 200 wątków(każdy ma osobne połączenie). Te wątki obsługują połączenia tcp/ip z innymi moimi programami. Ciężko jest mi skalować wykonać resty ponad 200 aplikacji klienckich czyli w sumie 200 wątków.

Tutaj jest rada, z użyciem dwóch rodzajów połączeń: https://www.reddit.com/r/golang/comments/16xswxd/concurrency_when_writing_data_into_sqlite/

frz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: las
  • Postów: 706
1
Windowbee napisał(a):

Dzień dobry czy w sqlite jest jakies ograniczenie połączonych wątków z bazą w trybie wal(jeden zapis i dużo odczytów jednocześnie)? Czy to tylko kwestia ramu dla cache size i podobnych pochodnych?

No i tak, i nie. Oficjalnie SQLite jest lekki, zgrabny, ale... to nadal Maluch, a nie Mercedes. Tryb WAL (czyli Write-Ahead Logging) to fajny bajer — pozwala na to, żeby wiele wątków mogło czytać z bazy jednocześnie, nawet gdy jeden coś tam zapisuje. Ale to nie czyni z SQLite cudownej maszyny do obsługi dużego ruchu.

SQLite nie ogarnia pełnej współbieżności jak "dorosłe" bazy typu MySQL czy PostgreSQL. Prędzej czy później trafisz na komunikat w stylu:
„database is locked”. I nie ma przebacz — baza się blokuje i nie wpuści nikogo, dopóki ten jeden nie odpuści. A jak nie odpuści, to trzeba będzie killować proces, restartować appkę albo, o zgrozo, całe środowisko.

Co możesz zrobić, żeby to jakoś ogarnąć:
Włącz WAL:

Kopiuj
conn = sqlite3.connect('moja_baza.db')
conn.execute('PRAGMA journal_mode=WAL')

Dzięki temu odczyty nie będą blokowane przez zapisy i odwrotnie. Ale nie łudź się – działa to dobrze tylko do pewnego momentu.

Zapisuj batchem, a nie co sekundę – zamiast robić tysiąc małych INSERT-ów, zbieraj dane i wrzucaj hurtem. Baza mniej się dusi.

Kolejkuj operacje samemu – SQLite sam z siebie nie ma mechanizmu kolejkowania zapytań. Musisz to ogarnąć w swoim kodzie:

  • wrzucasz operacje do kolejki

  • jedna po drugiej są realizowane

  • masz kontrolę nad tym, kto co i kiedy robi.

Inaczej zrobi się bigos i nic nie będzie działać, a użytkownik tylko rzuci: „aplikacja to kupa”.

Cache size i RAM mają znaczenie, ale to tylko kosmetyka. Możesz mieć tonę ramu, a i tak polegniesz, jeśli kilka wątków rzuci się naraz na bazę z odczytem i zapisem. SQLite nie był projektowany jako multi-user monster. To bardziej plik .db do trzymania danych lokalnie, szybko i na krótko. Okej dla embedded chyba.

SQLite + WAL = fajnie, ale tylko do pewnego momentu.
Jak planujesz więcej niż jednego użytkownika albo większy ruch – bierz coś dorosłego:
MySQL albo Postgres. Obie są legitne. Do pet-projektów wielu ludzi bierze MySQL, ale to już kwestia gustu.

SQLite to super narzędzie na start, do prototypowania, do offline'owych appów.
Ale jak tylko zacznie się robić tłoczno – będzie bolało.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
1
frz napisał(a):

Kolejkuj operacje samemu – SQLite sam z siebie nie ma mechanizmu kolejkowania zapytań. Musisz to ogarnąć w swoim kodzie:

  • wrzucasz operacje do kolejki

  • jedna po drugiej są realizowane

  • masz kontrolę nad tym, kto co i kiedy robi.

Czyli sposób na osiągnięcie wielu wątków na raz z sqlite, to używać jednego wątku na raz? 😄

frz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: las
  • Postów: 706
1
Riddle napisał(a):
frz napisał(a):

Kolejkuj operacje samemu – SQLite sam z siebie nie ma mechanizmu kolejkowania zapytań. Musisz to ogarnąć w swoim kodzie:

  • wrzucasz operacje do kolejki

  • jedna po drugiej są realizowane

  • masz kontrolę nad tym, kto co i kiedy robi.

Czyli sposób na osiągnięcie wielu wątków na raz z sqlite, to używać jednego wątku na raz? 😄

Brzmi jak żart? No trochę tak. Ale niestety — tak to właśnie działa.

Ale serio, fakt-check:
SQLite oficjalnie:

nie jest bazą wielowątkową,

wspiera tylko ograniczoną współbieżność – dzięki WAL może czytać wielu, ale pisać tylko jeden,

nie ma wbudowanego schedulera ani kolejki – aplikacja musi ogarniać dostęp do bazy.

Tak że śmieszkowanie śmieszkowaniem, ale mówienie, że z SQLite trzeba robić serializację operacji przy dużym obciążeniu — to prawda.

Jak komuś udało się z tego Malucha zrobić Mercedesa – czapki z głów. Pytańko - po co gdy można użyć natomiast MySQL albo Postgres.

Upd: Dobra, wyznam — mi się nie udało, próbowałem różne sposoby, w końcu natomiast przełączyłem się na postgres. Może komuś się jednak uda.

MY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1107
0

O ile dobrze kojarzę, to kolega niestety walczy z problemami które sam sobie tworzy. Tutaj już było o tym pisane. Wygląda mi to na kontynuację tematu.

Patrzę, że kolega już ma 200 klientów działających jednocześnie. To dalej wskazuje na to, że potrzeba tu normalnej bazy danych. Ewentualnie jak już padło wcześniej wewnętrznego bufora w postaci kolejki. Jednak takiej do której pisze wszystkie 200 wątków. Natomiast jeden wątek czyta kolejkę w trybie FIFO i spokojnie sobie zapisuje do bazy SQLite. Zapisane rekordy usuwa z kolejki i już. Pytanie czy warto. O wiele lepiej użyć czegoś co zostało już napisane i przetestowane nie jeden raz.

WI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 148
0

Dzięki za odpowiedzi.
Jest to Prawie kontynuacje tamtego tematu ale jestem znacząco dalej i w zasadzie nie jest problemem już- współbieżność. Zapisy mam małe jak na malucha przystało.
Dominują odczyty zdecydowanie - zapisy to tylko logi oraz co jakiś czas aktualizacja tabel (poj komórek). Problemy „dużych baz” mnie nie interesują bo wszystko działa bez instalacji - serwer przenieść można „kopiuj/wklej” zbudowałem go na niskopoziomowym tcp/ip.
Zmartwienie miałem ile odczytów na raz zniesie baza bo być może to będzie mocno skalowane - dużo użytkowników. Zapisy i tak kolejkuje mój program serwerowy więc kolizji nie mam.
Tylko jeden z setek równoważnych wątków może pisać w bazie sqlite w jednym czasie (zamknięte to jest w criticalsection z lazarusa/delphi). Zapisy są błyskawiczne przy utrzymywanym połączeniu i nie rozłączaniu z bazą. Dzieki temu silnikowi mam takie funkcje jakie chcę przy dość prostym programie sieciowym - technicznie prostym, a merytorycznie złożonym- funkcja programu. Więc ogłaszam ,że zdementować trzeba uwagi o kiepskim działaniu w takim układzie sqlite jako działanie w wielu wątkach. Nadal tabele są dość proste ale przy takim układzie jest to bardzo szybkie i wydajne - niewiele ramu i procesora zjada, nie wymaga instalacji, loguje błędy.
Znalazłem dzięki Wam też info że zasadzie połączenia z bazą ograniczy ram głównie.
Utrzymanie workera- wątku albo wątków które pośredniczą bardzo spowalniało odczyty a zwłaszcza zapis. Tak gdy kazdy wątek ma polączenie , ustawiony jest wal to transakcje insertów i inne zapisy zajmują nieistotny czas.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
1

Sqlite i współbieżność nie idzie w parze, próbowałem niedawno debugować memory leek z asyncio i ta wspaniała baza, przyciśnięta podkręconymi, max_workers mówiła mi GTFO - jestem zablkowana.

MY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1107
1

@Windowbee skoro kolejka Ci nie wyszła, to pokazuje, że nie masz doświadczenia. Po prostu współbieżność nie jest taka prosta jak niektórym się wydaje. Ale skoro piszesz:

Windowbee napisał(a):

Więc ogłaszam ,że zdementować trzeba uwagi o kiepskim działaniu w takim układzie sqlite jako działanie w wielu wątkach.

Pokazuje tylko fakt, że nie widzisz pewnych rzeczy. Każdy pisze, że SQLIte nie nadaje się, ale Ty ogłaszasz wszem i wobec, że te trudności nie występują. Z takimi argumentami nie chce się dyskutować. Nie raz i nie jedna osoba pisała Ci, żebyś nie szedł tą drogą. Cóż nie posłuchałeś, mam nadzieję, że kiedyś w końcu przekonasz się, że ludzie radzą Ci dobrze. Już uargumentowałem, że sam pomysł trzymania serwera na pendrive bez instalacji jest słaby. Teraz jak piszesz o 200 klientach tylko potwierdzasz moje obawy, że nie wiesz co robisz. Ale ja Cię już przestałem namawiać do tego byś zmienił podejście. Swojego posta napisałem tylko aby inni nie musieli się produkować i pisać na darmo ;)

PS. nie traktuj tego osobiście. Nie mam na celu atakować, tylko stwierdzam obiektywnie jak to wygląda.

WI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 148
0
Mr.YaHooo napisał(a):

@Windowbee skoro kolejka Ci nie wyszła, to pokazuje, że nie masz doświadczenia. Po prostu współbieżność nie jest taka prosta jak niektórym się wydaje. Ale skoro piszesz:

Windowbee napisał(a):

Więc ogłaszam ,że zdementować trzeba uwagi o kiepskim działaniu w takim układzie sqlite jako działanie w wielu wątkach.

Pokazuje tylko fakt, że nie widzisz pewnych rzeczy. Każdy pisze, że SQLIte nie nadaje się, ale Ty ogłaszasz wszem i wobec, że te trudności nie występują. Z takimi argumentami nie chce się dyskutować. Nie raz i nie jedna osoba pisała Ci, żebyś nie szedł tą drogą. Cóż nie posłuchałeś, mam nadzieję, że kiedyś w końcu przekonasz się, że ludzie radzą Ci dobrze. Już uargumentowałem, że sam pomysł trzymania serwera na pendrive bez instalacji jest słaby. Teraz jak piszesz o 200 klientach tylko potwierdzasz moje obawy, że nie wiesz co robisz. Ale ja Cię już przestałem namawiać do tego byś zmienił podejście. Swojego posta napisałem tylko aby inni nie musieli się produkować i pisać na darmo ;)

PS. nie traktuj tego osobiście. Nie mam na celu atakować, tylko stwierdzam obiektywnie jak to wygląda.

@Mr.YaHooo:
Nie traktuję personalnie. I problemów właśnie nie mam. Mialem tylko pytanie ile jednocześnie wątków może mieć sqlite3 podłaczonych w odczycie czy macie taką wiedzę(żeby w razie co się dalej nie pchać) mocniejsze bazy danych odpadają. A sqlite Obsłużyło mi 1000. Nadal bez problemu na słabym sprzęcie.

WI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 148
0
Mr.YaHooo napisał(a):

@Windowbee skoro kolejka Ci nie wyszła, to pokazuje, że nie masz doświadczenia. Po prostu współbieżność nie jest taka prosta jak niektórym się wydaje. Ale skoro piszesz:

Windowbee napisał(a):

Więc ogłaszam ,że zdementować trzeba uwagi o kiepskim działaniu w takim układzie sqlite jako działanie w wielu wątkach.

Pokazuje tylko fakt, że nie widzisz pewnych rzeczy. Każdy pisze, że SQLIte nie nadaje się, ale Ty ogłaszasz wszem i wobec, że te trudności nie występują. Z takimi argumentami nie chce się dyskutować. Nie raz i nie jedna osoba pisała Ci, żebyś nie szedł tą drogą. Cóż nie posłuchałeś, mam nadzieję, że kiedyś w końcu przekonasz się, że ludzie radzą Ci dobrze. Już uargumentowałem, że sam pomysł trzymania serwera na pendrive bez instalacji jest słaby. Teraz jak piszesz o 200 klientach tylko potwierdzasz moje obawy, że nie wiesz co robisz. Ale ja Cię już przestałem namawiać do tego byś zmienił podejście. Swojego posta napisałem tylko aby inni nie musieli się produkować i pisać na darmo ;)

PS. nie traktuj tego osobiście. Nie mam na celu atakować, tylko stwierdzam obiektywnie jak to wygląda.

@Mr.YaHooo:
Nie traktuję personalnie. I problemów właśnie nie mam. Mialem tylko pytanie ile jednocześnie wątków może mieć sqlite3 podłaczonych w odczycie czy macie taką wiedzę(żeby w razie co się dalej nie pchać) mocniejsze bazy danych odpadają. A sqlite Obsłużyło mi 1000. Nadal bez problemu na słabym sprzęcie.

MY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1107
0
Windowbee napisał(a):

Nie traktuję personalnie. I problemów właśnie nie mam. Mialem tylko pytanie ile jednocześnie wątków może mieć sqlite3 podłaczonych w odczycie czy macie taką wiedzę(żeby w razie co się dalej nie pchać) mocniejsze bazy danych odpadają. A sqlite Obsłużyło mi 1000. Nadal bez problemu na słabym sprzęcie.

W takim razie odpowiedź będzie taka. Teoretycznie jeśli wszystko będzie poprawnie napisane, to nie powinno być ograniczeń. Ogranicza Cię w zasadzie tylko liczba wątków jakie dasz radę utworzyć w systemie operacyjnym.

To jest tak samo jak zapis do pliku. Poprawne współdzielenie jednego pliku jest możliwe, ale upierdliwe. Bardzo ciężko jest zabezpieczyć się przed wszystkimi sytuacjami. Jednak jeśli zrobisz to dobrze nie będziesz mieć problemu z wątkami. Pojawią się za to inne, typu wydajność, buforowanie przy zapisie i tego typu sprawy. Im więcej będziesz miał wątków zapisujących tym większa szansa na uszkodzenie pliku.

WI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 148
0

@Mr.YaHooo:
Dzięki o takie info mi chodziło :)
Zapisy zawsze są kolejkowane przez albo osobny wątek i tylko on zapisuje albo przez klauzulę criticalsection .enter i leave poszczególnych wątków dla zapisów. To drugie działa znacznie wydajniej na razie niż osobny wątek zapisujący przesłane dane.

MY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1107
0

@Windowbee w takim razie ciekaw jestem jak to wyjdzie. W razie czego daj znać :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.