Cześć, w jaki najpraktyczniejszy sposób utrzymujecie integralność allocationSize
jednocześnie w aplikacji i na bazie danych? Tutaj akurat używam postgresa + hibernate
mariusz00 napisał(a):
Cześć, w jaki najpraktyczniejszy sposób utrzymujecie integralność
allocationSize
jednocześnie w aplikacji i na bazie danych? Tutaj akurat używam postgresa + hibernate
Nie spotkalem, aby ktos sobie stawiał taki problem. Do kawy dokumentacja, i ...
a) w JPA to jest liczba, id ID-ków pobieramy na zapas (sztuk, mały integer), które robi KLIENT bazy czyli JPA w stosunku do bazy
b) w bazach (specyficzne dla dialektu) ilość kB, o ile zwiększamy plik.
Więc znajduję, że to zupełnie inne liczby, nie mające żadnego związku.
Chyba że wskażesz inaczej ?
Dokładnie jak @jarekr000000 napisał.
Próbuje przeszukać internet i znaleźć jakieś rozwiązanie czy istnieje sposób aby w jednym miejscu zarządzać spójnością przyrostów.
Wstępnie natknąłem się na PooledOptimizer ale nie wiem czy to jest dobry kierunek
@mariusz00: bo zaczyna nam tu wychodzić masło maślane. Po co chcesz utrzymywać spójny allocationSize
w bazach na różnych środowiskach?
Od podstaw na przykładzie postgresa (ale wszędzie działa podobnie).
Baza danych
Parametr increment
w sekwencjach służy do określenia kroku sekwencji. Domyślnie wynosi 1, czyli kolejna wartość w sekwencji będzie równa obecna wartość + 1
. Nie jest to zbyt wydajne, szczególnie w środowiskach wielowątkowych, gdzie do bazy łączy się wielu klientów. Dlatego wprowadzono parametr cache
, który mówi, ile wartości z sekwencji zostaje wyliczonych na zapas zanim będzie kolejne wyliczanie. W przypadku gdy baza zostanie zrestartowana, te wyliczone na przód wartości mogą zostać utracone. Domyślnie cache
ma wartość 1, co oznacza brak mechanizmu cachowania.
Mechanizm wyliczający wartość sekwencji jest synchronizowany, to znaczy, że jeżeli dwóch klientów zapyta o kolejną wartość, to otrzymają różne wyniki z zachowaniem inkrementacji. Jeżeli jeden z klientów nie wykorzysta otrzymanej wartości, to ona przepadnie.
JPA/Hibernate
Parametr allocationSize
mówi, ile kolejnych wartości zostanie pobranych z sekwencji, zanim JPA znowu odpyta o wartości z sekwencji. Domyślna wartość tego parametru wynosi 50.
Baza + JPA
Teraz przechodzimy do przykładu. Uruchamiam moją bazę danych i wykonuję takie oto zapytanie:
CREATE SEQUENCE IF NOT EXISTS my_seq START 1 ;
SELECT last_value FROM my_seq;
last_value |
---|
1 |
Jeżeli teraz uruchomię aplikację w domyślnych ustawieniach, to pobierze ona kolejnych 50 wartości i zapisze je w swoim lokalnym cache. Efektywnie oznacza to wykonanie zapytania
SELECT nextval('my_seq') FROM generate_series(1,50);
Wtedy
SELECT last_value FROM my_seq;
zwróci:
last_value |
---|
50 |
Jak widać JPA pobrało 50 wartości z sekwencji.
Teraz jeżeli uruchomię druga kopię aplikacji, która będzie miała allocationSize
ustawiony na 100, to efektywnie wykonam:
SELECT nextval('my_seq') FROM generate_series(1,100);
----
SELECT last_value FROM my_seq;
I otrzymam:
last_value |
---|
150 |
Co więcej, jeżeli uruchomię te aplikacje równocześnie, to wyniki będą różnić się w zależności, która z nich otrzyma pierwsza dostęp do generatora. W dodatku, jeżeli jedna z nich wywali się w czasie uruchamiania, ale już PO pobraniu sekwencji, to wartości te będą stracone.
Podsumowanie
Wracam do pytania, co chcesz osiągnąć?
allocationSize
nie ma nic wspólnego z increment
w bazie danych. Ma trochę wspólnego z cache
sekwencji, ale też niewiele. W bardzo ekstremalnych przypadkach możesz spróbować poprawić wydajność aplikacji, koordynując cache
z bazy z allocationSize
klienta i liczbą klientów. Całość będzie opierać się o założenie, że nigdy nie dojdzie do sytuacji, gdy wielu klientów będzie jednocześnie pobierać tak dużo wartości, że każdy będzie czyścić cache
.
Koziołek napisał(a):
@mariusz00: bo zaczyna nam tu wychodzić masło maślane.
..
W przypadku gdy baza zostanie zrestartowana, te wyliczone na przód wartości mogą zostać utracone.
...
Jeżeli jeden z klientów nie wykorzysta otrzymanej wartości, to ona przepadnie.
...
Co więcej, jeżeli uruchomię te aplikacje równocześnie, to wyniki będą różnić się w zależności, która z nich otrzyma pierwsza dostęp do generatora. W dodatku, jeżeli jedna z nich wywali się w czasie uruchamiania, ale już PO pobraniu sekwencji, to wartości te będą stracone.>
PodsumowanieWracam do pytania, co chcesz osiągnąć?
Moja pesymistyczna intuicja /doświadczenie podpowiada, że OP chce ciągle ID, co jest marzeniem każdego Delphisty, ale mżonką