H2DB + IDE – case study

Przez ten tydzień nie zrobiłem tego co sobie założyłem, natomiast ujarzmiłem wreszcie bazę danych, aby działała tak jak sobie życzę. Nie obyło się to jednak bez problemów, dlatego właśnie na tym temacie chciałbym się dzisiaj skupić.

H2 Database

H2 to baza danych, której główną (dla mnie) zaletą jest to, że jest szybka i lekka. Potrafi działać w trybach:

  • In-memory
  • Embedded
  • Server mode
  • Mixed mode

In-memory, to, jak sama nazwa wskazuje, baza przechowywana w pamięci, natomiast embedded oznacza że dane są trzymane w postaci pliku. Dwa ostatnie tryby opiszę później. 🙂

Oprócz tego, H2 ma też przyjemną dokumentację oraz proste, webowe GUI. To wszystko sprawia, że moim zdaniem jest bardzo dobrym wyborem, jeśli chodzi o development.

IDE nie chce współpracować – czy aby na pewno?

Po skonfigurowaniu bazy w trybie in-memory wszystko wydawało się w porządku. Skrypty, które miały tworzyć i wypełniać tabele działały, miałem połączenie z bazą z poziomu aplikacji i wszystkie operacje śmigały tak jak powinny.

Do zarządzania nie korzystałem jednak z konsoli webowej, a z IDE. Okazało się, że zmian, które wprowadzam w H2, nie widać w IntelliJ. Ten nadal widział rekordy w takim stanie, w jakim były tuż po przetworzeniu startowych skryptów.

Moja konfiguracja wyglądała wtedy tak:

Miałem wielu podejrzanych, w tym Hibernate czy źle skonfigurowane opcje IDE związane z bazą. Byłem za to pewien, że samą bazę mam ustawioną poprawnie, w końcu nie ma tam zbyt dużo do roboty. Oczywiście okazało się, że to wina H2, a raczej moja, bo tylko pobieżnie przejrzałem dokumentację.

Rozwiązanie problemu

Otóż, H2 domyślnie działa tak, że każdy proces, który łączy się z bazą, otrzymuje jej unikalną instancję. Dlatego też IntelliJ nie widział zmian.

Jeśli chcemy łączyć się z tą samą bazą z więcej niż jednego miejsca, mamy do dyspozycji dwa tryby:

  • Server mode – uruchamiany jest serwer, do którego może łączyć się wielu klientów; minusem jest fakt, że również nasza aplikacja łączy się z serwerem, co jest wolniejsze niż operacje na pliku
  • Mixed mode – w tym przypadku pierwszy klient, który łączy się z bazą danych, operuje bezpośrednio na pliku, natomiast przy następnym połączeniu odpalany jest serwer i każdy kolejny klient korzysta z tegoż właśnie serwera. Dlatego też jest to zdecydowanie lepsze rozwiązanie, jako że operacje są tutaj szybsze.

Tak więc wystarczyło parę zmian w konfiguracji, a mianowicie przerzucenie odpowiedzialności za odpalanie skryptów na H2 oraz oczywiście skorzystanie z mixed mode i wszystko zaczęło działać jak należy.

Teraz zarówno aplikacja jak i IDE korzystają z tej samej instancji bazy danych.

Morał? Dokładniej czytać dokumentację! 🙂