2011-02-26 3 views
0

최대 절전 모드 3.3 나는 동적으로Hibernate - HQL 쿼리의 결과 SQL은 최대 절전 모드 시스템에 의해 캐시됩니까?

String query = "from Foo where "; 
if(beforeDate != null) then query+=" createdBefore < :before"; 
session.createQuery(query); 

같은 HQL 쿼리를 최대 절전 모드로 생성되는 코드를 가지고 있다면

SessionManager에 의해 캐시 얻을 DB에서 실행 얻을 것이다 결과 SQL을합니까 그래서 같은 경우 쿼리가 계속 실행될 때마다 매번 다시 컴파일 할 필요가 없으며 매번 최대 절전 모드로 다시 구문 분석되고 다시 작성됩니까?

필자는 dbcode의 성능을 향상시키기 위해 하이버 네이트에 정적 명명 된 쿼리를 써야 파싱 오버 헤드를 줄일 수 있다고 생각합니다.

+0

매번 SQL이 생성됩니다. 동일한 세션에서 쿼리가 두 번째로 구문 분석되지 않습니다 (createQuery (query)와 동일한 결과를 제공하는 경우) – bestsss

+0

아, 그건 문질러 질 것입니다. 그래서 우리는 생각합니다. 기본적으로 createQuery가 호출 될 때마다 다시 호출됩니다. -parsed가 맞습니까? 그렇다면 패턴을 바꿔야 할 것입니다. – toths

+0

아니요, 명명 된 쿼리를 사용하면 문자열이 파싱되지 않지만 SQL이 생성됩니다. 나는 SQL의 생성에 대해 거의 긍정적이지만 소스를 확인해야 할 수도있다. 나 자신하지만 조건을 쿼리를 사용하지 마십시오. tdavies가 가리키는대로 – bestsss

답변

0

매번 새 쿼리를 만들기 때문에 SQL이 캐시되지 않습니다. 쿼리를 캐시 할 수는 있지만 파싱 오버 헤드가 중요하지는 않습니다. 해당 쿼리의 성능을 확인하기 위해

어떤 것들은 :

  • createdBefore에 적합한 인덱스가 있습니까?
  • Foo이 다른 객체와 '적절하다'는 관계 - 가능한 경우 게으르며 필요한 경우 엄격합니다. Foo에는 Bar 테이블에서로드 된 멤버가 있습니다. 게으른 관계를 만들면 가입을 피할 수 있지만 각 Foo에 속한 Bar에 액세스하면 n 개의 쿼리가 더 많이 수행되어 lazy="false" 설정을 해제하는 것이 좋습니다.
  • before에 대해 동일한 값으로 쿼리를 여러 번 작성하면 Foo 테이블은 최대 절전 모드를 통해서만 업데이트되며 쿼리 한 것보다 자주 업데이트되지 않으며 결과 집합의 크기가 너무 크지 않습니다 query cache

언제나 성능 문제가 있으므로 측정 전후에 반복 가능해야합니다.

+0

"매번 새로운 쿼리를 생성하기 때문에 SQL이 캐시되지 않습니다."- 틀렸어! Hibernate는 각 SQL 질의에 대해 SQLQueryPlan 객체를 생성한다. Hibernate는 항상 같은 SQLQueryPlan 객체를 사용한다. 그런 다음 동일한 SQL 쿼리에 대해 "createQuery"메소드를 두 번 이상 호출한다. –