Wpis z mikrobloga

#programowanie #bazydanych #java #spring

tl;dr: jak zrobić produkcyjnie rective relacyjną bazę w Javie/Springu?

Żeby na froncie dane był pokazywane na żywo (a nie odświeżane np. co sekundę) to stosuje się Websockety (komunikacja pomiędzy frontem a backendem).

A co z komunikacją pomiędzy backendem z bazą danych?
- Jak stosuje się bazy NoSQL np. MongoDB, to nie ma problemu, bo da się w Jave/Springu zasubskrybować na zmiany w bazie (podejście reactive tzn. Flux/Mono).
- Co z relacyjnymi bazami danych (np. PostgreSQL, Oracle, MS SQL)? Zwykłe JDBC nie wspiera podejścia reactive (A bez tego nie wiadomo kiedy coś się w bazie zmieniło bez sprawdzania co np. sekundę). Teoretycznie jest R2DBC, ale to bardzo wczesna wersja i chyba nikt nie używa tego na produkcji. Jak ludzie to robią produkcyjnie z relacyjnymi bazami?
  • 13
@mk321: odpowiedź brzmi, nie robią ( ͡° ͜ʖ ͡°)

nie szukaj po słówku "reactive", tylko raczej "non blocking". JDBC przez swoje API zawsze będzie tylko blocking. Są drivery do baz danych nieblokujące, ale one nie zapewniają spójnej warstwy abstrakcji jak JDBC. Ogółem, rzeźba w #!$%@? i nie polecam tego robić w sofcie, który ma być parę lat w utrzymaniu (a jak wiemy, prowizorki są najtrwalsze).
@globalbus: no właśnie nie chciałbym robić jakiś dziwnych rzeczy, tylko użyć czegoś standardowego. Soft ma być utrzymywany parę lat.

Mam tylko wymaganie, że muszę mieć dane "na żywo".
1) Tylko pod to jedno wymaganie zmienić bazę relacyjną (super wsparcie JPA/Hibernate; mam w zespole specjalistów od relacyjnych baz) na NoSQL (wsparcie non blocking, ale dużo gorzej z JPA; nikt w zespole dobrze nie zna nierelacyjnych)?
2) Zostawić bazę relacyjną, ale użyć eksperymentalnego
postgresie


@globalbus: będę musiał wspierać kilka baz np. obowiązkowo Postgres i dodatkowo jedna z Oracle/MS SQL/MySQL/MariaDB. Między innymi dlatego też używam JPA/Spring Data. Wiem, że zawsze jakiś wyjątek trzeba zrobić pod kolejną bazę, ale chciałbym jak najmniej używać specyficznych rzeczy z konkretnej bazy.
@mk321: Nie widziałem użycia JPA/Hibernate z innym API niż JDBC. To by była straszna rzeźba, którą też trzeba utrzymywać.

O generyku pod wiele baz zapomnij, bo nie istnieje ( ͡° ͜ʖ ͡°)
Już lepiej lepić potworka, który łączy jakiś cache nonsqlowy z relacyjną bazą. Wybór konkretnego zestawu jest bardzo specyficzny i zależny od danych.
Na potrzeby szybkich wyszukiwań pełnotekstowych popularne jest miksowanie elasticsearch z relacyjnymi.
@mk321: jeżeli to ma być monolit, to chyba można podejść do tego inaczej. Pomiędzy repozytorium a resztą aplikacji zrób jakiegoś pośrednika, i zastosuj obserwatora który będzie powiadamiał websocketa o zmianach w tabeli. Na upartego w mikroserwisach też da się to zastosować.
Nie widziałem użycia JPA/Hibernate z innym API niż JDBC. To by była straszna rzeźba, którą też trzeba utrzymywać.


@globalbus: nie było, bo istnieje chyba tylko R2DBC, które było w wersji beta, a dopiero od niedawna jest w GA. Tylko ciekawe czy ktoś tego będzie używał.
Czemu rzeźba? Jakby samemu trzeba było to robić to pewnie tak, ale z R2DBC może nie?

O generyku pod wiele baz zapomnij, bo nie istnieje

Spring
@krasnoludkolo: tak, pomiędzy frontem a backendem:

(Oczywiście na froncie muszą być websockety, ale to nie problem - problem z backendem i bazą.)


Ale websocketów z bazy do backendu nie zrobię.