tag:blogger.com,1999:blog-5197374494377847819.post2186869880325652828..comments2024-03-22T22:13:46.650+01:00Comments on Holistycznie o inżynierii oprogramowania: Lazy Loading a sprawa wydajnościSławek Sobótkahttp://www.blogger.com/profile/15082577671795313109noreply@blogger.comBlogger9125tag:blogger.com,1999:blog-5197374494377847819.post-19090372542315286242016-04-07T16:05:36.797+02:002016-04-07T16:05:36.797+02:00A tutaj moje odświeżone spojrzenie na temat LL: ro...A tutaj moje odświeżone spojrzenie na temat LL: robić tak aby było zbędne: https://www.youtube.com/watch?v=uj25PbkHb94Sławek Sobótkahttps://www.blogger.com/profile/15082577671795313109noreply@blogger.comtag:blogger.com,1999:blog-5197374494377847819.post-78901337916445435462016-04-07T16:03:58.731+02:002016-04-07T16:03:58.731+02:00Wersja w EJB 3.0 na interceptorach
public class N...Wersja w EJB 3.0 na interceptorach<br /><br />public class NPlusOneSelectProblemDetectingInterceptor {<br /> <br /> @PersistenceUnit<br /> private EntityManagerFactory entityManagerFactory; <br /> <br /> @AroundInvoke<br /> public Object countStatements(InvocationContext invContext)<br /> throws Exception {<br /> InjectedEntityManagerFactory iemf = (InjectedEntityManagerFactory)<br /> entityManagerFactory;<br /> EntityManagerFactoryImpl hemf = (EntityManagerFactoryImpl)<br /> iemf.getDelegate(); <br /> <br /> SessionFactory sessionFactory = hemf.getSessionFactory();<br /> Statistics statistics = sessionFactory.getStatistics();<br /> statistics.setStatisticsEnabled(true);<br /> <br /> long before = statistics.getPrepareStatementCount();<br /> <br /> Object result = invContext.proceed();<br /> <br /> long count = statistics.getPrepareStatementCount() - before;<br /> if (count > 30){<br /> String message = invContext.getTarget().getClass()<br /> + "->" + invContext.getMethod().getName() + " statements: " + count;<br /> //TODO wysłać maila do db-nazi <br /> }<br /> return result;<br /> }<br />}<br /><br /><br />W drugiej linijce krytyczne jest rzutowanie. Z tego co pamiętam, to różne wersje tego samego serwera mogą mieć inne klasy, a nawet zagnieżdżenie obiektów prowadzących do EMF.<br /><br />W Springu będzie analogicznie na Aspektach.Sławek Sobótkahttps://www.blogger.com/profile/15082577671795313109noreply@blogger.comtag:blogger.com,1999:blog-5197374494377847819.post-2226221982849094132016-04-07T12:08:28.400+02:002016-04-07T12:08:28.400+02:00@SławiekSobótka,
Czy jesteś jeszcze w stanie wydłu...@SławiekSobótka,<br />Czy jesteś jeszcze w stanie wydłubać to?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5197374494377847819.post-61021685392872480032014-12-20T11:40:29.270+01:002014-12-20T11:40:29.270+01:00Minęło ponad 5 lat, mój preferowany styl architekt...Minęło ponad 5 lat, mój preferowany styl architektoniczny i styl programowania zmienił się mocno pod wpływem DDD, tak więc teraz w nietrywialnych przypadkach unikał bym LL. Mówię tym w prezentacji http://art-of-software.blogspot.com/2014/12/video-z-prezentacji-na-jdd-2014.html i piszę w artykule http://bottega.com.pl/pdf/materialy/receptury/orm.pdf<br /><br />Co do testów o jakich pisał milus to popełniłem aspekt w springu i interceptor w ejb, który wykrywa takie zjawiska, gdyby ktoś potrzebował to mogę wydłubać.Sławek Sobótkahttps://www.blogger.com/profile/15082577671795313109noreply@blogger.comtag:blogger.com,1999:blog-5197374494377847819.post-49873440678906797272014-12-20T01:38:29.610+01:002014-12-20T01:38:29.610+01:00A ja jestem początkującym Javovcem-Hibernetowcem i...A ja jestem początkującym Javovcem-Hibernetowcem i wreszcie piękny, obrazowy artykuł o niuansach z LL itp. W żadnym tutorialu inni nie piszą o tym na co uważać, że o braku przykładów nie wspomnę. A tu przystępnie i miło się czyta. I komentarze fachowców też konkretne.<br /><br />Podoba mi się!Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5197374494377847819.post-16245243643306094602009-09-02T09:04:14.019+02:002009-09-02T09:04:14.019+02:00Kto będzie miał czas je pisac?
No oczywiscie powi...Kto będzie miał czas je pisac?<br /><br />No oczywiscie powinno to byc obowiązkiem developera. Ale tak jak pisałem robi sie to stosunkowo prosto a co najwazniejsze przy korzystaniu z istniejacych juz rozwiazan: Spring TestContextFramework i Statistics bardzo szybkomilushttps://www.blogger.com/profile/04255791953013506623noreply@blogger.comtag:blogger.com,1999:blog-5197374494377847819.post-40436675047602790322009-09-02T00:28:32.785+02:002009-09-02T00:28:32.785+02:00Nie, to nie był żart. Żartować owszem sobie można,...Nie, to nie był żart. Żartować owszem sobie można, ale z systemów, gdzie jeden user zarzyna bazę danych;P<br /><br />Nie chodziło mi o śledzenie wszystkiego. Z czasem nabywa się intuicji, które operacje mogą coś zamulić. Chodzi o to aby po prostu zawsze upewnić się ile zapytań idzie do bazy. I nie chodzi mi też o paranoję, gdzie zamiast 1 prostego idą 3 proste - dajmy sobie spokój, to nie lata 80.<br /><br />Ale masz rację w sprawie namieszania w przyszłości. Ten argument jak najbardziej mnie przekonuje. Jestem w stanie wyobrazić sobie, ze jedna zmiana mapowania burzy kruchą równowagę.<br /><br />Idea testów, które zliczają PreparedStatements jest jak najbardziej ok. Pytanie tylko kto będzie miał czas aby je pisać?<br /><br />Powiem tak: najlepiej byłoby testować ilość tych zapytań - tak jak piszesz, ale jeżeli nie to warto przynajmniej spojrzeć na konsolę:)Sławek Sobótkahttps://www.blogger.com/profile/15082577671795313109noreply@blogger.comtag:blogger.com,1999:blog-5197374494377847819.post-1000186590370912852009-09-01T18:43:00.771+02:002009-09-01T18:43:00.771+02:00"Podstawą pracy z ORM jest konsola z logami&q..."Podstawą pracy z ORM jest konsola z logami" - to chyba jakiś żart<br /><br />Nie wyobrazam sobie w dużym systemie śledzenie zaytań, które pojawiają się na konsole...<br />Nawet jeśli jestem w stanie się przeczołgac i śledzic jakieś sql jakiś tam funkcjonalności to i tak nie mam pewności, że nawet jak uda mi się coś naprawic (napisac lepszego HQL, poprawic mapowanie) to w przyszłości ktoś nie namiesza w zapytaniach/mapowaniach ponownie.<br /><br />Roziwązaniem tego problemu jest bardzo proste a co więcej dostępne od dawna out-of-box w Hibernate, a mianowicie sessionFactory.getStatistics();<br />Niestety sama w sobie dokumentacja jest uboga ale najwazniejsza metoda to getPreparedStatementsCount().<br /><br />Jeśli jeszcze do tego korzystam z SpringFramework, a szczególnie Spring Test ContextFramework(polecam moją prezentacje na Javarsovia 2009) to mamy możliwosc testowania naszych zapytan/mapowac bezpośrednio z JUNIT.milushttps://www.blogger.com/profile/04255791953013506623noreply@blogger.comtag:blogger.com,1999:blog-5197374494377847819.post-18645895897269174392009-04-24T17:56:00.000+02:002009-04-24T17:56:00.000+02:00Gwoli ścisłości: oprócz eager i lazy loading, Hibe...Gwoli ścisłości: oprócz eager i lazy loading, Hibernate ma też opcję batch-size="N", dzięki której zamiast n+1 selektów mamy około n/N selektów. Ale jak w wyniku zagnieżdżenia tych selektów zamiast n^k mamy n^k/N selektów, co już nie jest takim zyskiem.<br /><br />Pomóc tu mogłyby tylko jakieś bardziej inteligentne algorytmy śledzące i przewidujące żądania do bazy. Po stronie serwera bazy takowe do optymalizacji złożonych selectów są stosowane od lat: http://www.postgresql.org/docs/6.3/static/c49.htm (ten przykładowy używa algorytmu genetycznego!)Irek Matysiewiczhttps://www.blogger.com/profile/02786161827081997066noreply@blogger.com