2014-06-23 3 views
7

리눅스 서버에서 실행되는 자바가있는 서버 측 응용 프로그램을 코딩합니다. 나는 세션을 데이터베이스에 오픈하기 위해 하이버 네이트를 사용하고 네이티브 SQL을 사용하여 쿼리하고 try, catch, finally로이 세션을 항상 닫는다.최대 절전 모드를 사용할 때 메모리 사용량이 많음

매우 높은 빈도로 최대 절전 모드를 사용하는 내 서버 쿼리 DB.

이미 MaxHeapSize를 정의했는데 3000M이지만 일반적으로 RAM에서 2.7GB를 사용하지만 감소보다 느려질 수 있습니다. 때때로 MaxWeapSize가 3.6GB 메모리 사용량까지 증가합니다. MaxHeapSize는 시작시 정의합니다.

사용되는 메모리가 3.6GB 일 때, 나는 -jmap 명령으로 덤프를 시도하고 크기가 1.3GB 인 힙 덤프 만 받았습니다. 여기에, 그것을 분석하는 일식 MAT를 사용하여

임 내가이 같은 많은 org.apache.commons.collections.map.AbstractReferenceMap $ ReferenceEntry을 가지고, 내가 최대 절전 모드 문제라고 생각 MAT Dominator tree 의 지배자 트리입니다. 가비지 콜렉션으로 처리 할 수 ​​없거나 느려질 수는 있습니다.

어떻게 해결할 수 있습니까?

답변

10

IN 쿼리 목록에 250k 개의 항목이 있습니다. 네이티브 쿼리조차도 데이터베이스를 무릎 꿇게합니다. 성능상의 이유로 Oracle은 IN 쿼리 목록을 1000으로 제한하므로 동일한 쿼리를 수행해야합니다.

RAM을 더 늘리면 문제가 해결되지 않으므로 페이지 매김을 사용하여 선택/업데이트를 최대 1000 개 항목의 배치로 제한해야합니다.

Streaming is an option 그러나 큰 결과 집합의 경우 일반적으로 keyset pagination이 가장 좋습니다.

데이터베이스에서 모든 처리를 수행 할 수 있다면 DB에서 응용 프로그램으로 250KB의 레코드를 이동할 필요가 없습니다. 많은 RDBMS에서 고급 절차 언어 (예 : PL/SQL, T-SQL)를 제공하는 데는 매우 좋은 이유가 있습니다.

+0

조금 더 가르쳐 줄 수 있습니까? 오라클 데이터베이스 상호 작용에 대한 경험이 거의 없습니다. – Viet

+1

N 개의 항목을 가져와 업데이트하고 다음 배치를 가져 오는 등의 작업이 필요합니다. –

+0

나는 여전히 내 질문에 "혼란 스럽다. .. 업데이트 .. 어디에서 .. (...) ", IN 질의 목록이 작고 1000에 도달 할 수 없습니다. 그리고 내가 이클립스 MAT에서 Dominator 트리의 리프로 확장 할 때, 내 선택 쿼리 ('sqlQueryCheckSet'내 코드에서), 많은 것을 찾을 수 있으며, it – Viet

1

Hibernate issue에 대한 링크가있는 Vlad Mihalcea 고맙습니다. 최대 절전 모드 버그이며, 버전 3.6에서 수정되었습니다. 난 그냥 최대 절전 모드 버전 3.3.2 버전 3.6.10, "hibernate.query.plan_cache_max_soft_references"(2048), "hibernate.query.plan_cache_max_strong_references"(128)의 기본값을 사용하여 내 문제가 사라집니다. 높은 메모리 사용량이 없습니다.

3

queryPlanCache 내의 개체 수를 구성하고 제한 할 수 있지만 그만큼 일반적이지는 않습니다. 우리의 경우

우리는이에 HQL 유사한에서 쿼리를 작성했다 : 이것은 queryPlanCache에가는 N 다른 쿼리의 결과

hql = String.format("from Entity where msisdn='%s'", msisdn); 

. 우리가이 쿼리를 변경하는 경우 : 거의 0으로 queryPlanCache의 크기가 극적으로 100MB의에서 감소되었다

hql = "from Blacklist where msisnd = :msisdn"; 
... 
query.setParameter("msisdn", msisdn); 

이 두 번째 쿼리는 캐시 내부에 하나의 객체를 생성 한 하나의 preparedStament로 변환됩니다.