2014-01-31 2 views
0

org.hibernate.Query#list이라는 메서드로 성능 문제가있다. 메서드 호출의 지속 시간은 시간에 따라 다양합니다. 일반적으로 약 1 초, 며칠, 어쩌면 반나절이면 약 20 초 걸립니다.org.hibernate.Query # 목록이 임의로 느리다.

어떻게이 문제를 해결할 수 있습니까? 이 문제의 원인을 어떻게 결정할 수 있습니까? 이 문제의 분석에

더 많은 요소 :

  • 성능 문제는 생산 환경에서 관찰되었지만, 설명 된 문제는 테스트 환경에 있습니다.
  • 문제는 적어도 몇 주 동안 관찰되었지만 기원 날짜는 알려지지 않았습니다. 데이터베이스 서버가 안 :
  • 기본 쿼리는 MS SQL 서버 (2008 R2)에서 뷰 (선택)입니다 : 한 번에 소수의 사용자로부터
    • 데이터베이스 읽기 /이 테스트 환경의 글입니다 지나치게 독점적이며 데이터는 시간이 지남에 따라 천천히 변합니다.
    • MS SQL Server 클라이언트에서 직접 정확한 쿼리를 실행하면 항상이 1 초 이내에 완료됩니다.
    • (데이터베이스를 백업하고이 백업을 새 데이터베이스로 복원하기 위해 MS SQL Server 클라이언트를 사용하여) 데이터베이스 복제는 문제를 재현하지 못하게합니다. 즉, 메서드 호출로 인해 복제본이 빨라집니다.
  • 응용 프로그램은 최대 절전 모드 (4.2.x를) 및 Java 4.2 최대 절전 모드 3.5 6.
    • 업그레이드 문제에 대해 아무 것도 변경되지 않았습니다 사용합니다.
    • 메서드 호출은 항상 동일한 인수를 사용합니다. 즉, 작업을 수행하는 테스트 메서드가 있습니다.
    • (hprof를 사용하여) 메소드 호출을 프로파일 링하면 길이가 길 때 "Object.wait"및 "ref.ReferenceQueue.remove"에 대부분 소요됩니다. 메소드 호출시 기본 쿼리 시간을 기록 log4jdbc를 사용
    • 는 다음과 같은 결과를 보여줍니다
      • 쿼리 < 1 초 => 방법 ~ 1 초
      • 쿼리 ~ 3S => 방법 ~ 20 대
  • 쿼리는 this issue에서 가장 득표 한 대답에 설명 된대로 POJO를 생성합니다.
  • 나는 어떤 영향을 미치는지 이해할 수 없기 때문에 가장 높은 투표 결과 (this other similar issue)에 설명 된대로 모든 속성을 가진 생성자를 사용하여 시도하지 않았습니다.

답변

0

Hibernate 쿼리에서 명백하게 임의로 느려질 가능성이있는 원인은 세션을 비우는 것입니다. 동일한 트랜잭션에서 일부 명령문 (삽입, 업데이트, 삭제)이 플러시되지 않으면 쿼리의 list 메소드가 자동 플러시를 수행 할 수 있습니다 (현재 플러시 모드에 따라 다름). 그렇다면 list()가 호출 된 쿼리로 인해 성능 문제가 발생하지 않을 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 당신이 제안하는 원인을 시험 할 방법을 설명해 주시겠습니까? 아마도 문제가 될 수있는 것을 테스트하기 전에 모든 작업을 비우는 것과 같은 것일까요? – cooltea

0

MS SQL Server와 프로 시저의 계획 업데이트에 문제가있는 것 같습니다. DBCC FREEPROCCACHE, DBCC DROPCLEANBUFFERS 다음과 같은 쿼리 및 메서드 시간이 일관됩니다.

문제의 해결책은 MS SQL Server를 업그레이드하는 것일 수 있습니다. MS SQL Server 2008 R2 SP2로 업그레이드하면 문제가 더 이상 나타나지 않습니다.

쿼리 기간과 메서드의 차이점은 반환되는 개체와 관련된 지수 요소입니다. 대부분의 시간은 결과 집합의 소켓 읽기에 소요됩니다.

+0

원본 질문은 다음과 같이 중복 될 수 있습니다. http://stackoverflow.com/q/642093 – cooltea