Sqlite3 dla wielu przez własny serwer

0

Witajcie po długiej przerwie,
Jakiś czas temu pytałem o sens napisania własnego serwera bazy danych dostosowanego pod siebie i jak zwykle mieliście rację mówiąc że stopień skomplikowania obsługi stanie się nieznośny.. Co prawda działa na mac os i windows ale ze względu na wielowątkowość obsługi plików zaczynam sie gubić.
Dlatego przestawiam projekt na korzystanie z sqlite3.
Pytanie jest takie: Czy uważacie że sqlite3 w połączeniu z moim serwerem pośredniczącym to dobry sposób na wykorzystanie tej bazy dla wielu programów jednocześnie? (jednoczasowo ok 5-20 klientów korzystających z malego przesyłu danych zwykle komendy noop dla potwierdzenia połączenia).
Schemat wygląda tak- program kliencki łączy się z moim serwerem(napisałem go więc mogę dowolnie modyfikować) . Serwer łaczy się wtedy z odpowiednią bazą i przesyła polecenia sql. Następnie odbiera odpowiedzi sqlite3 po czym wyniki zwraca przez tcp//ip do klienta. Wszystko idzie drogą szyfrowaną a komputer z serwerem jest w chronionym pomieszczeniu. Hasła w bazach są hashowane.
Nie chcę firebirda postresql itp bo są bardzo duze , wymagają instalacji a moje wymaganie jest takie aby serwer wraz z bazą mógł być przeniesiony na pendrive do dowolnego komputera mac albo windows.
Do działania mojego serwera wystarczy przekierowanie portów na routerze, w przypadku dynamicznego ip mój serwer aktualizuje wpisy w duckdns.org tak, że nadal jest znajdowany przez programy klienckie. Jeśli ma działać na stałym ip to zaznacza się aby użył wewnętrznego ip jako publicznego i wtedy serwer może działać w sieciach izolowanych bez dostępu do internetu.
Jeśli ma działać w sieci internet to publiczny adres ip sprawdza po każdym nieudanym auto- logowaniu co 30 sek. W ten sposób wykrywa zmianę dynamicznego adresu ip.

Ps programuję hobbystycznie i dla użytkowania w moim szpitalu.

1

Tak. Problemy mogą być ze skalowaniem (ale wątpie, że będziesz trzymał setki gigabajtów) oraz z wydajnością wielu zapisów jednocześnie (tradycyjne bazy są mocno zoptymalizowane pod to kosztem innych ficzerów). Dla małych zastosowań SQLIte to zdecydowanie najprostsze i najwydajniejsze rozwiązanie

1

A nie myślałeś o Firebird w wersji Embedded ? Też nie wymaga instalacji i łatwo możesz przejść do pełnej, wielodostępowej bazy

0

@Windowbee

Biblioteki na mac os są mega problemem a sqlite działa bardzo dobrze i boje sie troche koniguracji której sam nie bedę robił typowo pod moją mala wiedze

Biblioteki będą potrzebne tyko dla warstwy pośredniej (serwera pośredniczącego).
Pod serwerem pośredniczącym, zamiast bazy Sqlite będziesz miał Firebird Embedded.
Ps.
Nie napisałeś pod jakim systemem działa Twój serwer

3

Przecież to jest bez sensu, robisz api do programu (db) który daje już bezpośredni dostęp do swoich funkcji

0

A jeśli na mac os bede chciał przenieść serwer? to biblioteki mnie zabiją. Dwa tyg się z tym męczyłem. Już zadowolony ustawilem wszystko przyszła większa aktualizacja maca i nie może znaleźć bibliotek… ale rozumiem dlaczego firebirda byś proponował. (Jest mocnoejszy zdecydowanie).
Nie wiem tylko czy dla małych projektów z tworzeniem różnych baz w sqlite3 będzie widać jakąś różnicę w porównaniu do firebirda (a kłopot z ustawieniami firebirda zostaje). Poza tym pisanie serwera do komunikacji z firebirdem kiedy ma możliwość zdalnej komunikacji sam firebird wydaje się dodatkową pracą.
Mój serwer rozdziela pracę i tworzy osobne wątki dla każdego połączenia. Czytanie z bazy (co bedzie głównym ich zadaniem )nawet z jedną bazą sqlite3 powinno iść w samej jednej bazie bez problemu wielowątkowo. Zapisy mogą czekać bardziej…. Tak mi się wydaje . Dlatego pytam , a firebird … zbyt skomplikowany multiplatformowo. Bedzie potrzeba ciągłego nadzoru i konfiguracji.

2
Windowbee napisał(a):

Schemat wygląda tak- program kliencki łączy się z moim serwerem(napisałem go więc mogę dowolnie modyfikować) . Serwer łaczy się wtedy z odpowiednią bazą i przesyła polecenia sql. Następnie odbiera odpowiedzi sqlite3 po czym wyniki zwraca przez tcp//ip do klienta. Wszystko idzie drogą szyfrowaną a komputer z serwerem jest w chronionym pomieszczeniu. Hasła w bazach są hashowane.
Nie chcę firebirda postresql itp bo są bardzo duze , wymagają instalacji a moje wymaganie jest takie aby serwer wraz z bazą mógł być przeniesiony na pendrive do dowolnego komputera mac albo windows.

Czekaj, czekaj. Twierdzisz, że chcesz swój produkt trzymać zainstalowany na pendrive i móc przepinać go radośnie między różnymi maszynami i tak to ma działać? Tak się nie robi, a gdzie kopie zapasowe, bezpieczeństwo danych? Jakaś redundancja itp? Nie mówię już o wydajności czy awaryjności takiego rozwiązania.

Windowbee napisał(a):

Ps programuję hobbystycznie i dla użytkowania w moim szpitalu.

Czyli całość ma działać wewnątrz jednej organizacji? W takim razie dlaczego wszystko robisz na około? Jaki jest cel tego, że klienci łączą się poprzez internet, ale znajdują się w jednej sieci?

Windowbee napisał(a):

a firebird … zbyt skomplikowany multiplatformowo. Bedzie potrzeba ciągłego nadzoru i konfiguracji.

Firebird potrzebuje ciągłego nadzoru? Mam klientów którzy nie mają informatyka i jak zainstalowałem im wersję 2.1.7 na domyślnych ustawieniach jakieś 8-9 lat temu to dalej na tym działają bez żadnej awarii :D

Jak zauważyli poprzednicy dublujesz coś co już sensowna baza danych oferuje. Nie, SQLite nie jest sensowną bazą. Nie ma tam chyba nawet pełnej kompatybilności ze starszymi standardami SQL.
Może powiedz coś więcej o projekcie, skąd się łączą klienci i dlaczego chcesz dane przesyłać przez internet. Bo może warto będzie użyć czegoś zupełnie innego.

Windowbee napisał(a):

A jeśli na mac os bede chciał przenieść serwer? to biblioteki mnie zabiją. Dwa tyg się z tym męczyłem.

Jakbyś od początku pisał aplikację będącą np. grubym klientem za pomocą np. komponentów ZeosLib to byś w 2 tygodnie miał już dużą część aplikacji. A tak piszesz serwer, który to jest dość ciężko napisać tak aby był bezpieczny na ataki, dziwne dane, był bezpieczny wielowątkowo. W dodatku musisz opracować jakiś protokół swojego serwera z aplikacją kliencką. Co też nie jest łatwe, bo za jakiś czas się może okazać, że nie przewidziałeś czegoś i wtedy masz do poprawy znacznie więcej.

0

Coś więcej:
Bezpieczeństwo danych- kopie zapasowe/ w sqlite zrobi to mój serwer. W odp. Katalogach bedzie tworzył je co dziennie lub w innym interwale .Dzięki temu będzie możliwość cofnięcia się. Bazy są małe więc może ich być klikadziesiąt jako pliki sqlite3 (w razie potrzeby serwer przywróci konkretną bazę z archiwum kopii)

Serwer chcę używać do różnych moich projektów tzn ma obsługiwać różne programy i różnych użytkowników. Czasem będę chciał zabrać całość do siebie i poprawić znaleźć błąd przy pełnych danych(pełnych bazach) i na ip lokalnym 127.0.0.1. Piszę na moim laptopie i testy chciałbym robić na niezależnym układzie na jednej maszynie serwer/klient, klienci a nie na żywym organizmie działającym akurat.

Programy prowadzić będą grafiki i rozliczenia lekarzy z wystawianiem faktur , podpisem elektronicznym systemu , pomagać planować pracę w dynamicznie zmienianym systemem w zależnościnod potrzeb/ zmian.

Druga funkcja - pomoc w doborze antybiotyków i mapowania bakteriologicznego szpitala w zależności od wielu zmiennych dotyczących stanu pacjenta i choroby i antybiotykooporności.

3 funkcja - wykonywanie testu do wykrywania i diagnostyki wczesnych objawów demencji w walidowanym badaniu wieloośrodkowym.

To są funkcje między innymi…. Bo jest więcej .
Częśc osób/ użytkowników pracuje offline w terenie (wtedy mają serwer lokalny na pendrivie z bazą lokalną) a centralizuje się dopiero po połączeniu z internetem.

Część projektów jest dość rozbudowana. Ale serwer jaki piszę / już jest , jest wydajny w szyfrowaniu przesyłu i łączeniu z klientami , prowadzeniu logów itd. Ale nie wiem jak sqlite3 poradzi sobie z częstymi odczytami przede wszystkim. Zapisów danych bedzie mało.

Chciałbym potężniejsze narzędzie ale umieram na kompatybilności mac os z bibliotekami postgresql i firebird bo nie chcę instalować niczego w systemach. Żadnych bibliotek

0
Windowbee napisał(a):

Bezpieczeństwo danych- kopie zapasowe/ w sqlite zrobi to mój serwer. W odp. Katalogach bedzie tworzył je co dziennie lub w innym interwale .Dzięki temu będzie możliwość cofnięcia się. Bazy są małe więc może ich być klikadziesiąt jako pliki sqlite3 (w razie potrzeby serwer przywróci konkretną bazę z archiwum kopii)

Słaby pomysł z oddzielnymi bazami. Kilkadziesiąt oddzielnych baz to jakaś masakra. Jak użytkownik potem wybiera do której chce się zalogować? Jak będzie przebiegać aktualizacja przy nowej wersji programu gdzie dodasz pole? Nie idź tą drogą.

Windowbee napisał(a):

Serwer chcę używać do różnych moich projektów tzn ma obsługiwać różne programy i różnych użytkowników. Czasem będę chciał zabrać całość do siebie i poprawić znaleźć błąd przy pełnych danych(pełnych bazach) i na ip lokalnym 127.0.0.1. Piszę na moim laptopie i testy chciałbym robić na niezależnym układzie na jednej maszynie serwer/klient, klienci a nie na żywym organizmie działającym akurat.

Ale to samo daje się zrobić z normalną bazą danych. Zabierasz sobie kopię bazy danych i odpalasz lokalnie na środowisku deweloperskim. Nie jeden programista tak działa. To co opisujesz normalnie wpisuje się w cykl życia programu i nie potrzeba do tego żadnych serwerów poza bazą danych. Po prostu sam program bezpośrednio uderza do bazy danych za pomocą zapytań.

Windowbee napisał(a):

Programy prowadzić będą grafiki i rozliczenia lekarzy z wystawianiem faktur , podpisem elektronicznym systemu , pomagać planować pracę w dynamicznie zmienianym systemem w zależnościnod potrzeb/ zmian.

Druga funkcja - pomoc w doborze antybiotyków i mapowania bakteriologicznego szpitala w zależności od wielu zmiennych dotyczących stanu pacjenta i choroby i antybiotykooporności.

3 funkcja - wykonywanie testu do wykrywania i diagnostyki wczesnych objawów demencji walidowanym w badaniu wieloośrodkowym.

Szczerze, to jakoś nie widzę w takim zastosowaniu SQLite. Wcześniej czy później potkniesz się o jego niedoskonałości i będzie problem.

Windowbee napisał(a):

Częśc osób/ użytkowników pracuje offline w terenie (wtedy mają serwer lokalny na pendrivie z bazą lokalną) a centralizuje się dopiero po połączeniu z internetem.

Jeszcze raz. Trzymanie bazy danych na pendrive to jest niepoważny żart. Wystarczy luźne złącze USB odłączy się na pół sekundy i kończysz z uszkodzoną bazą. Nie raz w terenie pracowałem na laptopie. Wiem, że zdarza się uwalić pendrive.

Windowbee napisał(a):

Chciałbym potężniejsze narzędzie ale umieram na kompatybilności mac os z bibliotekami postgresql i firebird bo nie chcę instalować niczego w systemach. Żadnych bibliotek

Jakiej kompatybilności? Ludzie używają tego normalnie na Mac OS i jakoś nie mają problemów z tym.

Piszesz w komentarzu:

Firebird jest trudny do użycia z powodu bibliotek trudno dostępnych dla mac os różnych procesorów inwersji systemu.

Jakich bibliotek? Przecież normalnie masz instalkę tego. Na Windows też potrzebuje odpowiednich bibliotek, instalujesz to raz i działa. A jeśli Mac OS po aktualizacji wywala jakieś runtime to tylko powód aby go nie używać ;) Normalny system operacyjny nie wywala po aktualizacji doinstalowanych runtime.

Protokół już jest opracowany funkcjonował dobrze na plikach. Teraz czas na sql i bazę. Ale fakt że wolałbym się zajmować samym klientem a nie i klientem i serwerem.

Jak rozumiem przewidziałeś wszystko? Wszystkie typy danych, rodzaje żądań itp? Jestem pewny, że za jakiś czas przy rozbudowie programu trafisz na błąd. Naprawdę dobrze napisać serwer obsługujący wiele żądań w wątkach jest trudno. A potem wyśledzić jakiś race condition będzie Ci ciężko.

Nie żebym przekreślał Twój pomysł. Piszesz coś sensownego i bardzo dobrze. Na razie bazuj na istniejących rozwiązaniach. Potem jak nabierzesz doświadczenia będziesz mógł się wziąć za pisanie własnych serwerów. Najpierw dobrze opanuj pisanie normalnych klientów baz danych. Zwłaszcza, że ma to być program który będzie robić rzeczy przydatne w normalnej działalności komercyjnej.

0

„Słaby pomysł z oddzielnymi bazami. Kilkadziesiąt oddzielnych baz to jakaś masakra. Jak użytkownik potem wybiera do której chce się zalogować? Jak będzie przebiegać aktualizacja przy nowej wersji programu gdzie dodasz pole? Nie idź tą drogą.”

Rozumiem Ciebie.
Użytkownik nie bedzie miał bladego pojęcia z jakiej bazy korzysta. Mój program kliencki wyśle zapytanie do odpowiedniej bazy za użytkownika, w tym przekopiuje dane z terenu gdzie nie ma internetu a dane zbierał sobie na tymczasowej lokalnej bazie…
Użytkownik nic z sql nie bedzie miał wspólnego - bedzie widział efekt pracy programu klienckiego i interakcji z nim. Danych w bazie nie zobaczy , chyba że wejdzie w edycje tabeli aby zmodyfikować coś (np kierownik mikrobiologii).
Nowe bazy będzie tworzył serwer na polecenie klienta jeśli zajdzie potrzeba np utworzyć nowe funkcje pracy nowe stanowiska lub nowe schematy czegoś…. Tam też bazy byłyby usuwane w razie usunięcia schematu itd. Dzięki wielu bazom znacząco poprawi się szybkość zapisu wg tego co tylko wyczytalem.
Typy danych jakie chcę umieszczać to stringi i czasem strumienie(dane typu ciąg bajtów).

„Jakiej kompatybilności? Ludzie używają tego normalnie na Mac OS i jakoś nie mają problemów z tym.”

  • nie ma opcji tego przenosić / stacjonarnie jak zainstaluję to na danej maszynie działa. Ale przenoś to między systemami nie jest to przeniesienie „na dyskietce”
0
Windowbee napisał(a):

Użytkownik nie bedzie miał bladego pojęcia z jakiej bazy korzysta. Mój program kliencki wyśle zapytanie do odpowiedniej bazy za użytkownika, w tym przekopiuje dane z terenu gdzie nie ma internetu a dane zbierał sobie na tymczasowej lokalnej bazie…

A jak serwer zapanuje nad tymi bazami?

Windowbee napisał(a):

Użytkownik nic z sql nie bedzie miał wspólnego - bedzie widział efekt pracy programu klienckiego i interakcji z nim. Danych w bazie nie zobaczy , chyba że wejdzie w edycje tabeli aby zmodyfikować coś (np kierownik mikrobiologii).

To wiadomo, w żadnym przypadku zwykły użytkownik nie ma dostępu do SQL'a. Chociaż u siebie w systemie mam możliwość wklepania zapytań, wyświetlenia ich wyników na ekranie. Ale mało który użytkownik czyta dokumentację na tyle aby wiedzieć co gdzie z jakich tabel pobrać aby zobaczyć żądane dane. Zazwyczaj robi to nasz wdrożeniowiec.

Windowbee napisał(a):

Nowe bazy będzie tworzył serwer na polecenie klienta jeśli zajdzie potrzeba np utworzyć nowe funkcje pracy nowe stanowiska lub nowe schematy czegoś…. Tam też bazy byłyby usuwane w razie usunięcia schematu itd. Dzięki wielu bazom znacząco poprawi się szybkość zapisu wg tego co tylko wyczytalem.

To nie przy takich ilościach w dzisiejszych czasach baza wielkości 1GB to pryszcz. Dobrze napisane zapytania na komputerze do zadań biurowych ze optymalizowaną bazą będą generować zestawienia w akceptowalnym czasie.

Windowbee napisał(a):

Typy danych jakie chcę umieszczać to stringi i czasem strumienie(dane typu ciąg bajtów).

Jeśli takie masz ograniczenie, to faktycznie nie dużo tych możliwych danych. Jednak trzeba wszystko porządnie pozabezpieczać.

Windowbee napisał(a):
  • nie ma opcji tego przenosić / stacjonarnie jak zainstaluję to na danej maszynie działa. Ale przenoś to między systemami nie jest to przeniesienie „na dyskietce”

Ale aż tak ważna jest przenośność? Jeśli byś użył Firebird'a w wersji Embedded można osiągnąć to co chcesz.

1

Chyba sam poprzez oczytanie rozwiążę problem.
Serwer nim nie jest bo co najwyżej na polecenie tworzy nowe bazy/ usuwa i tworzy ścieżki ustawia tworzenie kopii zapasowych to nie filozofia.
Problemem nie jest też dostęp do danych w trybie wielowątkowym bo przy odczytach sqlite wg testów nie odstępuje kroku innym bazom.
Problem występuje w przypadku zapisu i tu można sprawę obejść tworząc tryb wielowątkowy w bazie i tryb wal. Oraz dzieląc bazę na kilka w usystematyzowany sposób.
Czyli tabele które są wielowymiarowe i mają obce klucze zależne powinny być w jednym pliku bazy a tabele niezależne w innych plikach. W ten sposób uzyskuje się współbieżność wątków w pracy z bazą a później serwera z klientami.
Pytanie czy ktoś tego z Was próbował ? Czy tylko teoretycznie radzicie? (Wiem że bardzo zaawansowani jesteście ale moje projekty nie mają wielu użytkowników na raz podłączonych , a już zwłaszcza często zapisujących dane.

1

Wiem, że masz swoje argumenty, do tego już we wcześniejszych wątkach pokazałeś, że mimo robienia po swojemu - jednak to całkiem dobrze działa. Także nie powinienem Cię pouczać, ale tym razem muszę to napisać - to, że wynajdujesz koło na nowo to zdecydowanie za słabe określenie. To, czego chcesz dokładnie i od daaaawna ogarniają silniki SQL, a Ty zasadniczo tworzysz swój silnik/front/API do tego SQL, chociaż 99% z tego co chcesz to masz działające od razu po zainstalowaniu, a do tego istniejący silnik usuwa 140% tego, co stwarza Ci problem.

Sam też często robię rzeczy po swojemu, wiem lepiej od reszty świata co jest dobre itp, ale tym razem ja bym poszedł w działającego, gotowego i sprawdzonego SQL, do którego będziesz walić zapytania "po bożemu", a nie szedł w jakieś customowe wynalazki.

1

Cerrato,
Próbowałem firebirda i postgresql guzik bibliotek cała masa dla klienta, nie każdy komp ma zainstalowane zależności bibliotek , których nie rozumiem a żeby to było tylko w windows to bym to ogarnął może ale już na 3 systemach / wysiadam(mac arm intel i windows) a jeśli w przyszlosci bede chciał, na ios albo nawet androida to nie wiem jak w ogóle. Do wszystkich tych baz aby połączyć się zdalnie to najpierw potrzebne są biblioteki zgodne z wersją bazy i systemu ,do tego nie są gotowe dylib ani dll czesto też, nie tylko trzeba je kompilować. Przy próbach pokazuje, że brakuje takiej a takiej , kiedy dodam okazuje się że brakuje kolejnych. Przy takich zastosowaniach jak chciałbym poświęciłem w sumie dwa bite tygodnie na robienie tego (nie ogarnąłem na te systemy, nie znalazłem bibliotek skompilowanych a moje kompilacje nie działały, pewnie coś źle robiłem). Te dwa tygodnie zniechęciły mnie do czegokolwiek na kolejne pół roku. Upieram się na sqlite tylko przez swoją niekompetencję dostosowania klientów różnych systemów do wymagań bibliotekowych konkretnych baz oraz trudności z przeniesieniem baz jako całych na inny kompletnie komputer a czesto i system. No tak w skrócie. Bo co do zasady wiem że macie argumenty nie do zbicia że lepiej mieć bazę typowo multiwątkową i standardową bo to i tak jest przyszłość. Z drugiej jednak strony czy ja będę zawodowym programistą? Albo sprzedawał swoje programy ? (Raczej nie w stronę zdecydowanie nie, aż tak dobry nie jestem i nie stanę się). Ma to działać na interfejsie przystosowanym dla potrzeb użytkowników , pośród których sam się mieszczę

0

Nie mam pojęcia jak to działa na (przepraszam za wyrażenie) Apple, o ile pamiętam to w przypadku Windowsa i Linuksa ogranicza się to do wrzucenia dosłownie 2-3 plików (jakieś DLL czy coś w ten deseń) do katalogu z apką i po temacie, niczego nie trzeba instalować, kombinować itp.

Co do przesiadki na Androida - nie wiem w czym będziesz pisać, ale np. we Flutterze (bardzo fajne rozwiązanie, wieloplatformowe: ogarnia Androida i to brzydkie coś od Apple, do tego można od jakiegoś czasu pisać w tym aplikacje desktopowe na Windowsa, Linuksa i tego za przeproszeniem Mac) masz to łatwo ogarnięte:
https://www.dhiwise.com/post/how-to-connect-your-flutter-app-to-a-postgresql-database
https://pub.dev/packages/postgres

Jeszcze w temacie Lazarusa - podejrzewam, że to widziałeś, ale tak na wszelki wypadek wrzucę:
https://wiki.freepascal.org/postgres
https://www.streetinfo.lu/computing/lazarus/project/use_pgsql.html

Z drugiej jednak strony czy ja będę zawodowym programistą? Albo sprzedawał swoje programy ?

To inaczej, zastanów się na ile będziesz miał problem w tym Twoim szpitalu, jak się coś stanie, apka się wykrzaczy, baza rozjedzie, stracicie dane itp. To jest temat, nad którym warto się zastanowić.

1

Ty wpadłeś na jakiś poroniony pomysł żeby coś tak skomplikowanego jak baza danych wraz z apką były przenośne (pendrive), działała na wszystkim (arm,x64) i wszędzie(win,mac,unix), mogły działać nie zależnie i pewnie się jeszcze ze sobą synchronizować.

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.