본문 바로가기

프로그래밍 언어 노트/JAVA | Kotlin

Hibernate Query Plan 으로 인한 OOM 방지

한 2년전에 발생한 문제인데, Query Plan <- 이 용어가 한동안 기억이 안나서 끙끙거리다 작성

 

QueryPlanCache (Hibernate JavaDocs) (jboss.org)

 

QueryPlanCache (Hibernate JavaDocs)

Obtain the parameter metadata for given native-sql query. for native-sql queries, the param metadata is determined outside any relation to a query plan, because query plan creation and/or retrieval for a native-sql query depends on all of the return types

docs.jboss.org

 

간단히 말하면

SQL -> 쿼리문임 -> DSL 임 -> 해석됨 -> AST (추상구문트리) 로 메모리에 올라가야함.

오 그럼 AST 로 메모리에 저장해두면 빠르겟네! -> 캐시임

 

즉 쿼리 플랜 캐시는 AST 로 파싱된 SQL 구문을 메모리에 올려두는건데

당연하게도, 메모리에 올리면, 메모리를 차지하고, 캐쉬를 드롭게많이 저장하면 OOM 이 난다


기본적으로 캐쉬 ON 이 default 이기 때문에 (내가알기론)

다양한 SQL 을 쓴다면 OOM 이 나게된다. 그리고 이게 의외로 꽤 많이, 그리고 꾸준히 차지 하고, GC 메인 대상도 아니기 때문에 (실제로 쓰니까), 발생하는 Case 가 많음..

방법은 끄던가 (?), Max 값 같은 JVM / 하이버네이트 파라미터 수정을 해줘야함

728x90