programing

Hibernate + Java에서는 성능이 느리지만 동일한 기본 Oracle 쿼리와 함께 TOD를 사용하면 성능이 빠름

lastmoon 2023. 7. 26. 22:21
반응형

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

반응형