2014-12-19 30 views
9

Wstępnie skompilowane zapytania są kompilowane i buforowane z wyprzedzeniem przez dostawcę bazy danych (np. Oracle, serwer sql itp.), Dzięki czemu mogą być szybsze dla kolejnych połączeń, takich jak przygotowane oświadczenie.Czy nazwane kwerendy hibernacji są prekompilowane w prawdziwym tego słowa znaczeniu?

W Hibernate Zwane kwerendy mają być wstępnie skompilowane podczas uruchamiania serwera WWW. Czy oznacza to, że wszystkie zapytania są uruchamiane podczas samego uruchamiania serwera, aby mogły być wstępnie skompilowane przez dostawcę DB lub wstępna kompilacja ma inne znaczenie w kontekście hibernacji?

Odpowiedz

7
  1. Hibernacja nazwanych zapytania są wyrażone w Object Query Language (JPQL lub HQL), więc Hibernate musi przełożyć je do SQL pierwszy. Nazwane zapytania są przechowywane w NamedQueryRepository, a każde zapytanie jest reprezentowane przez NamedQueryDefinition.

    Ponieważ użytkownik może dynamicznie dodawać filtry, limity wyników zapytań, blokady i wskazówki, Hibernate nie może wstępnie skompilować HQL/JPQL do czasu wykonania.

  2. Hibernate wykorzystuje również PrepartedStatement dla każdego SELECT i DML oświadczenie, dzięki czemu można również uzyskać oświadczenie bazie prekompilację jeśli sterownik JDBC obsługuje go i nie naśladować fazę przygotowania przez multipleksowanie przygotowanie i wykonanie w jednym wniosku bazy (np. MySQL, PostgreSQL).

+0

Tak jak wyjaśniono w punkcie 1, nazwane kwerendy nie są prekompilowane w prawdziwym tego słowa znaczeniu. Uzgodnione podczas używania przygotowanej instrukcji w Hibernate, są one prekompilowane. –

+0

Po pierwszym wykonaniu będzie buforowany po stronie Java i DB. Więc nie będzie to problem z wydajnością. –

+0

Zaktualizowałem moją odpowiedź. Przeglądałem kod źródłowy i odkryłem, że nazwane zapytania są tłumaczone w środowisku wykonawczym, ponieważ Hibernate może również stosować blokady i filtry. –