HQL 또는 SQL 사용?가 져 온 장점: SQL 분석 시간 을 줄 이 고 메모리 비용 을 낮 추 며 SQL 주입 을 방지 합 니 다.

자바 원본 JDBC 규범 은 SQL 문 구 를 미리 컴 파일 하 는 Prepared Statement 을 제공 합 니 다. 이 클래스 와 자리 표시 자 (?) 를 사용 하면 SQL 문장의 실행 효율 을 높 일 수 있 습 니 다. 이것 도 자바 데이터베이스 개발 에서 추천 하 는 방법 입 니 다.전형 적 인 사용 은 다음 과 같다.
Connection conn = this.getconnection();  
string strsql = "select emp_id from employee where emp_id = ?";  
Preparedstatement pstmt = conn.preparestatement(strsql);  
pstmt.setstring(1,"1000");  
resultset rs = pstmt.executequery(); 

최근 에 우리 프로젝트 는 메모 리 를 낮 추 는 작업 을 하고 있 습 니 다. Memory Analyzer tool (MAT) 을 사용 하여 힙 덤 프 를 분석 한 결과 org. hibenate. impl. ession Factory Impl 이 대량의 메모 리 를 차지 하고 있 음 을 발 견 했 습 니 다.이 부분 은 저도 잘 모 르 겠 습 니 다. 여기에 동료 가 분석 한 결론 을 동봉 합 니 다.
1. Session Factory Impl 을 열 어 보면 SoftLimitMRUCache 가 들 어 있 고 HQLQuery PlanKey 대상 을 key 값 으로 하고 HQLQuery Plan 대상 을 value 로 하 는 시스템 HQL 의 분석 계획 캐 시 를 저장 합 니 다.평균 40 ~ 45k 의 메모 리 를 차지 하 는데 모두 6694 개가 넘 는데 이것 은 대량의 메모 리 를 차지한다.
2. SoftLimitMRUCache 는 소프트 연결 을 사용 하 는데 소프트 연결 은 가상 기기 의 메모리 사용률 이 높 을 때 GC 에 의 해 떨 어 지기 때문에 300 M 을 차지 하지만 시스템 메모리 에 이상 이 생기 지 않 습 니 다.그러나 이 캐 시가 존재 하기 때문에 시스템 메모리 가 더욱 빨리 소모 되 고 시스템 이 빈번 한 GC 를 초래 하여 시스템 운행 효율 에 영향 을 줄 수 있다.
3. SoftLimitMRUCache 를 분석 한 결과 조회 한 HQL 을 key 값 으로 하 는 Map 구조 임 을 알 수 있다.OQL 을 작성 하여 조회 하면 메모리 의 주요 캐 시가 어떤 HQL 인지 통계 할 수 있 습 니 다.
실 행 된 hql 문 구 를 분석 함으로써 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
A. 같은 HQL 입 니 다. 매개 변 수 를 연결 하 는 이유 로 Hibernate 는 서로 다르다 고 생각 하고 매개 변수 에 데 이 터 를 캐 시 합 니 다.B. "?" 자 리 를 차지 하 는 HQL 을 사용 하면 하나의 데이터 만 캐 시 합 니 다.이와 함께 이 를 통 해 하 이 버 네 이 트 뿐만 아니 라 Oracle 데이터베이스 도 SQL 구문 분석 계획 을 캐 시 해 데이터베이스 메모 리 를 소모 할 것 으로 추정 된다.
이전에 우 리 는 "?" 표현 식 을 사용 하 는 것 이 데이터베이스 에서 SQL 을 분석 하 는 시간 을 줄 이 고 SQL 의 실행 효율 을 높 일 수 있다 는 것 을 잘 알 고 있 었 다.그러나 우 리 는 데이터베이스 와 HQL 캐 시 SQL 분석 계획 에 사용 되 는 메모 리 를 줄 일 수 있다 는 것 을 무시 했다.따라서 DAO 층 의 코드 는 모두 사전 컴 파일 문 구 를 사용 하여 메모리 소 모 를 줄 이 는 동시에 조회 효율 도 높 일 것 을 권장 합 니 다.

좋은 웹페이지 즐겨찾기