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
@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 encji
@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ć?
@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.
@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"
@Darjo:
@SuppressWarnings("unchecked")
@Override
public List listVerificationsLight() {
Criteria cr = sessionFactory.getCurrentSession()
.createCriteria(STKVerification.class, "verification")
.createAlias("inventory", "inventory")
.createAlias("inventory.group", "group")
.setProjection(Projections.projectionList()
.add(Projections.property("verification.idverification"), "idverification")
.add(Projections.property("verification.verificationDate"), "verificationDate")
.add(Projections.property("verification.verified"), "verified")
.add(Projections.property("verification.comment"), "comment")
.add(Projections.property("inventory.idinventory"), "inventoryId")
.add(Projections.property("inventory.name"), "inventoryName")
.add(Projections.property("inventory.nextNumber"), "inventoryNextNumber")
.add(Projections.property("group.id
group"), "groupId")
.add(Projections.property("group.name"), "groupName"))
.addOrder(Order.desc("verification_date"))
.setResultTransformer(
Transformers.aliasToBean(STKVerificationModel.class));

return cr.list();
}

STKVerificationModel jest moim modelem, którym operuję na widoku. Lista zawiera ok 2k-3k rekordów. Potem możesz sobie na froncie przeglądać, filtrować, sortować, wykonywać jakieś połączone
@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.
@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?;)
@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 :)