최대 절전 모드 - 쿼리 캐싱/두 번째 레벨 캐시는 값 객체를 포함하는 값으로 작동하지 않습니다.
-
18-09-2019 - |
문제
나는 다음과 같은 문제로 어려움을 겪고 있습니다.
다른 패널을 포함하는 값 객체가 있습니다. 각 패널에는 필드 목록이 있습니다.
매핑 :
<class name="com.aviseurope.core.application.RACountryPanels" table="CTRY" schema="DBDEV1A" where="PEARL_CTRY='Y'" lazy="join">
<cache usage="read-only"/>
<id name="ctryCode">
<column name="CTRY_CD_ID" sql-type="VARCHAR2(2)" not-null="true"/>
</id>
<bag name="panelPE" table="RA_COUNTRY_MAPPING" fetch="join" where="MANDATORY_FLAG!='N'">
<key column="COUNTRY_LOCATION_ID"/>
<many-to-many class="com.aviseurope.core.application.RAFieldVO" column="RA_FIELD_MID" where="PANEL_ID='PE'"/>
</bag>
</class>
다음 기준을 사용하여 값 객체를 얻습니다.
Session m_Session = HibernateUtil.currentSession();
m_Criteria = m_Session.createCriteria(RACountryPanels.class);
m_Criteria.add(Expression.eq("ctryCode", p_Country));
m_Criteria.setCacheable(true);
쿼리 캐시에는 메인 선택 만 포함되어 있습니다.
select * from CTRY where ctry_cd_id=?
경마장과 Rafieldvo는 모두 2 단계 캐시입니다. 두 번째 레벨 캐시 컨텐츠를 확인하면 Rafields와 RacountryPanel도 공동으로 표시되는 것을 볼 수 있으며 CTRY_CD_ID = ... 쿼리 캐시 영역에서도 SELECT를 볼 수 있습니다.
서블릿을 호출 할 때 캐시를 사용하는 것처럼 보이지만 두 번째는 그렇지 않습니다. JMX를 사용하여 캐시의 내용을 확인하면 모든 것이 정상인 것처럼 보이지만 객체 액세스 시간을 측정하면 항상 캐시를 사용하는 것은 아닙니다.
졸탄을 건배합니다
해결책
나는 당신이 협회를 캐시해야한다고 생각합니다.
<bag name="panelPE" table="RA_COUNTRY_MAPPING" fetch="join" where="MANDATORY_FLAG!='N'">
<cache usage="read-write"/>
<key column="COUNTRY_LOCATION_ID"/>
<many-to-many class="com.aviseurope.core.application.RAFieldVO" column="RA_FIELD_MID" where="PANEL_ID='PE'"/>
</bag>
제휴하지 않습니다 StackOverflow