2017-03-02 15 views
0

Hibernate 쿼리 캐시의 맵에 키를 수동으로 추가 할 수 있습니까?Hibernate 쿼리 캐시 맵에 값을 수동으로 추가 할 수 있습니까?

from UserTable as u where u.username="Dan" and password="123456" 

을하고 그 결과 쿼리는 첫 번째 쿼리가 아니라 3

의 ID로 사용자를 반환 다음과 같이 내가 쿼리를

:

아래에있는 내 추론를 참조하십시오 한 번 실행되고 쿼리 캐시에로드됩니다.

이제 첫 번째 결과가 캐시되는 동안, 나는 동일한 사용자를 반환합니다 다음 쿼리

from UserTable as u where u.id=3 

를 발행하지만 여러 사이트, like so에서 배운대로, 쿼리는 다음과 같이 처리됩니다 전적으로 캐시에 의해 다른 쿼리 (제발 내가 틀렸다면 정정하십시오).

Hibernate에게 두 쿼리가 동일한 데이터를 리턴한다고 말할 수있는 방법이 있습니까? 이렇게하면 최대 절전 모드에서 데이터베이스를 두 번째로 누르는 것을 절약 할 수 있습니다.

제가 생각할 수있는 이론적 인 해결책은 첫 번째 쿼리를 실행 한 후 첫 번째 쿼리 값을 가진 두 번째 쿼리를 캐시에 주입하는 것이지만 가능하지는 않습니다.

답변

2

Hibernate에게 두 쿼리가 동일한 데이터를 리턴한다고 말할 수있는 방법이 있습니까? 번호

이렇게하면 최대 절전 모드에서 데이터베이스를 두 번째로 저장하지 않습니다. 큰 문제는 아닙니다. 쿼리 캐싱은 자주 실행되는 쿼리에 사용하기위한 것이므로 한 번의 실행만으로는 큰 차이를 만들어서는 안됩니다.

제가 생각할 수있는 이론적 인 해결책은 첫 번째 쿼리를 실행 한 후 첫 번째 쿼리 값이있는 두 번째 쿼리를 캐시에 주입하는 것이지만 가능하지는 않습니다. 이론적으로는 가능하지만 수동으로 구현하는 것은 매우 복잡합니다 (캐시 항목 형식, 타임 스탬프 캐시, 다른 동시 세션과의 적절한 동기화 등).

구체적인 예는 UserTable 엔티티에 대해 2 차 캐싱을 활성화하고 두 번째 쿼리를 실행하는 대신 session.load(UserTable.class, id)으로 사용자를로드하는 것입니다. 이렇게하면 사용자는 첫 번째 쿼리에서 L2 캐시로로드 되었기 때문에 L2 캐시에서 검색됩니다. 중요

: 당신이 UserTable 기업의 많은 레코드가있는 경우은, 어느 쪽도 아니 쿼리도 UserTable 개체의 캐시 될 수 없습니다. L2 캐싱에 대한 개요 및 모범 사례를 보려면 blog을 살펴보십시오.