allocation size Hibernate

0

Cześć, w jaki najpraktyczniejszy sposób utrzymujecie integralność allocationSize jednocześnie w aplikacji i na bazie danych? Tutaj akurat używam postgresa + hibernate

1
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 ?

0

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

6

@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.

1
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.>
Podsumowanie

Wracam 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ą

1 użytkowników online, w tym zalogowanych: 0, gości: 1