Hibernate + Java에서는 성능이 느리지만 동일한 기본 Oracle 쿼리와 함께 TOD를 사용하면 성능이 빠름
Oracle에서 최대 절전 모드 및 기본 쿼리와 관련된 성능 문제를 발견했습니다.Toad에서 여러 매개 변수를 사용하여 복잡한 SQL 쿼리를 실행하면 결과가 밀리초 단위로 표시됩니다.그러나 Hibernate를 사용하여 동일한 쿼리를 실행하면 이 시간이 크게 증가합니다(최대 4초 이상).
SQL 쿼리는 다소 복잡하며 고유한 값을 반환합니다(따라서 문제는 설치 클래스에 필요한 시간과 관련이 없습니다). SQL 쿼리에는 ':nameParameter' 형식의 여러 매개 변수가 포함되어 있습니다.이 쿼리는 문자열에 저장됩니다.예를들면,
String myNamedNativeQuery = "select count(*) from tables "+
"where column1 = :nameParameter1 "+
"and column2 = :nameParameter2";
//actually my sentence is much more complex!!
TOD에서 문장을 실행하면 몇 밀리초 안에 해결됩니다.하지만 이 문장을 Hibernate와 함께 사용하는 것.
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
동일한 결과를 얻기 위해 몇 초가 필요합니다.
네이티브 쿼리에서 파라미터를 직접 교체한 후 Hibernate를 사용하여 문장을 실행하면 시간이 급격하게 줄어듭니다.이는 다음과 같은 것입니다.
String strQuery = session.getNamedQuery("myNamedNativeQuery").getQueryString();
myNamedNativeQuery = myNamedNativeQuery.replace("nameParameter1", value1);
myNamedNativeQuery = myNamedNativeQuery.replace("nameParameter2", value2);
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.uniqueResult();
무슨 일이 일어나고 있는지 아는 사람?
잘 부탁드립니다.
PS: Oracle 버전은 9i 및 Hibernate 3.2입니다.
이 코드에 무슨 일이 일어나고 있는 것 같습니다.
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
다음과 같습니다.
줄 1: 지정된 매개 변수에 대한 일부 예상 값을 기반으로 쿼리 계획이 생성됩니다.
줄 4: 쿼리가 값 1 및 값 2로 실행되지만, 이러한 값은 줄 1에서 자세히 설명한 쿼리 계획에 대해 "좋은 값"이 아니므로 데이터베이스가 실제 값에 대해 매우 부적절한 계획을 실행하고 있으며 많은 시간이 소요됩니다.
왜요?
의 소스 코드를 보고 있습니다.HibernateSessionImpl.createSQLQuery(...)
다음 코드 라인을 찾았습니다.
SQLQueryImpl query = new SQLQueryImpl(
sql,
this,
factory.getQueryPlanCache().getSQLParameterMetadata( sql )
);
그것이 부르는 것입니다.getQueryPlanCache()
일부 매개 변수 메타데이터를 사용합니다.저는 이 메타데이터가 충분하지 않다고 생각합니다.
당신에 대한 나의 대답은:
모든 바인딩 매개 변수를 제거하고 세션 대신 상태 비저장 세션 사용
매개 변수 값을 포함한 전체 SQL을 사용하는 쿼리 대신 SQLQuery
StatelessSession session = sessionFactory.openStatelessSession();
저는 비슷한 문제를 겪었고 더 나은 해결책을 찾기 전까지는 이렇게 할 수 있었습니다.매개 변수화된 SQL 쿼리 속도가 느리고 활성화된 오라클 세션 최대 절전 모드를 참조
<property name = "hibernate.temp.use_jdbc_metadata_defaults">false</property>
이것을 hibernate.cfg.xml에 추가하거나 응용 프로그램 속성 파일을 업데이트합니다.
언급URL : https://stackoverflow.com/questions/14294735/slow-performance-on-hibernate-java-but-fast-when-i-use-toad-with-the-same-nati
'programing' 카테고리의 다른 글
jQuery '.is(":visible")'가 Chrome에서 작동하지 않음 (0) | 2023.07.26 |
---|---|
중간 복사본 없이 표준 C에서 memmove를 구현하는 방법은 무엇입니까? (0) | 2023.07.26 |
표의 다중 제약 조건:모든 위반을 가져오는 방법? (0) | 2023.07.26 |
장고에서 get, get_queryset, get_context_data를 언제 사용해야 합니까? (0) | 2023.07.26 |
javascript window.새 탭의 위치 (0) | 2023.07.26 |