Wpis z mikrobloga

Hej hej #webdev i #programowanie, przychodzę z ciekawym pytaniem :)
Mam w projekcie (#java, #hibernate, #primefaces, #postgres) jeden widok wyświetlający dane z wielu tabel. Obecnie zaciągam dane hibernatem cały czas, ale coś wolno mi to działa i wpadłem na ciekawy pomysł.

Chciałbym zrobić w bazie widok z potrzebnymi mi danymi (http://www.postgresql.org/docs/9.3/static/rules-materializedviews.html), widok byłby cache'owany, automatycznie przed selectem (czy lepiej po insercie) robiłbym refresha (http://stackoverflow.com/questions/23906977/refresh-a-materialized-view-automatically-using-a-rule-or-notify) i może by to działało szybciej.

Ogólnie w projekcie będzie więcej przeglądania danych niż modyfikowania. Kilka razy do roku wprowadzenie kilkudziesięciu rekordów, a tak to przeglądanie istniejących danych.

1) Nigdy nie robiłem widoków w bazie. Kiedy wg Was są najbardziej przydatne? Czy mój przypadek może się nadać, czy za bardzo kombinuję?
2) Czy wg Waszego doświadczenia szybciej powinienem dostać wszystkie dane z widoku, czy te same dane wyciągając ORMem przez jakieś ichniejsze metody?
3) Jeśli będę robił refresh automatycznie po insercie i okaże się, że trwa on 2-3 sekundy, to czy podczas pobierania danych aplikacja zwolni na ten czas, czy pobierze nieaktualne dane z widoku z pg? Bo gdyby pobierała nieaktualne, to trochę słabo...

Co myślicie?
  • 14
  • Odpowiedz
@MetroStation: pytanie nr 1 - po co w projekcie ktory glownie czyta dane uzywac hibernate? dostajesz wszystkie wady hibernate i zadnej zalety. pytanie pomocnicze - zapytania robisz na encjach? jesli tak to hibernate buduje cache na wypadek ich edycji (czego nie robisz), stad spadek wydajnosci. moja propozyja - uzywanie encji hibernate zostaw tylko do cruda, zapytania do przegladania danych rob sqlem (jak engine bazy staly), albo hibernatem ale nie uzywaj
  • Odpowiedz
@Darjo: Hibernate jest wymogiem i nie mam na to wpływu. Do cruda używam encji, a do zapytań albo ciągnę po encjach, albo częściej przez criteria api wybieram projekcją konkretne kolumny z 3-4 tabel i docelowo zapisuję do modelu odpowiadającemu polom na widoku.

A nie wiesz czy można by to jeszcze jakoś przyspieszyć?
  • Odpowiedz
@MetroStation: kurcze, musialbym kod zdekompilowac, bo ja robie tylko dodatkowe moduly do systemu, ktory opakowuje hibernate swoimi bibliotekami i szczegolow implementacji niestety nie znam. postaram sie sprawdzic jak to w srodku maja skonfigurowane.
  • Odpowiedz
@MetroStation: tak na szybko jeszcze - moze faktycznie nie w tym miejscu lezy problem. sprawdz jakie zapytanie sql wygenerowal hibernate, moze ono jest niewydajne. a moze jeszcze inne miejsce. moze sprawdz jprofilerem co tak naprawde "muli"
  • Odpowiedz
@Darjo: Ładowanie danych trwa ok 3-4 sekundy i widać laga na frontach, co mnie nieco drażni. Chyba że to norma?:)
Właśnie nie chciało mi się pisać hql, ale wszystko zmierza ku temu jesli stateless session nie pomoże.
  • Odpowiedz
@Darjo: Pic polega na tym, że jest tam dużo filtrowania po każdej z tych kolumn i lazyloading dużo by mi nie dał, zmuliłby się przy filtrowaniu. A danych aż tak dużo tu nie ma :)
No nic, to spróbuję coś pogrzebać jutro, może się uda przyspieszyć nieco.

Thx za pomoc! Gdybym miał jakieś pytania to mogę na priv albo wołać w poście?;)
  • Odpowiedz
@MetroStation: czyli filtrowanie na kliencie robisz? no to faktycznie stronicowanie nic by nie dalo. chyba ze filtrowanie od razu w zapytaniu bedziesz robil... choc pewnie mocno by to skomplikowalo pobieranie danych. wolaj, wolaj, moze uda mi sie skuteczniej pomoc :)
  • Odpowiedz