1. 캐싱 소개
(1) 캐시 란 무엇입니까?
원래의 의미는 일반 랜덤 액세스 메모리보다 더 빠른 액세스 속도를 가진 RAM 유형을 의미하며 일반적으로 시스템의 메인 메모리와 같은 DRAM 기술을 사용하지 않고 비싸지 만 빠른 SRAM 기술을 사용합니다. 프로그래밍의 소위 캐시
는 프로그램 이나 시스템에서 자주 호출되는 객체 (임시 데이터)를 메모리에 저장하여 사용 중일 때 새 반복 인스턴스를 만들 필요없이 빠르게 호출 할 수 있도록하는 것입니다.
(2) 캐싱의 의미는 무엇입니까?
캐싱은 데이터베이스와의 상호 작용 수를 줄이는 데 사용되어 시스템 오버 헤드를 줄이고 실행 효율성을 향상시킬 수 있습니다.
(3) 캐싱에 적합한 데이터
캐시 된 데이터에 적용 가능 : 자주 쿼리되고 자주 변경되지 않으며 데이터의 정확성은 최종 결과에 거의 영향을 미치지 않습니다.
캐시 된 데이터에는 적용되지 않음 : 자주 변경되는 데이터, 데이터의 정확성은 최종 결과에 큰 영향을 미칩니다.
2. 레벨 1 캐시
MyBatis의 첫 번째 레벨 캐시는 실제로 sqlsession 레벨이며, 이는 sqlsession이 자체 레벨 1 캐시의 데이터에만 액세스 할 수 있음을 의미합니다. 1 차 캐시 질의는 sqlsession 클래스의 각 인스턴스 객체에 존재하며, 특정 데이터를 처음 질의하면 sqlsession 클래스의 인스턴스 객체가 해당 데이터를 1 차 캐시에 저장합니다. 이러한 방식으로 데이터 변경 요청을 받기 전에 쿼리 데이터를 데이터베이스의 데이터 대신 캐시에서 가져 오므로 잦은 데이터베이스 쿼리를 크게 줄이고 효율성을 떨어 뜨립니다. 다시 쿼리 할 때 SqlSession에 있는지 여부를 직접 사용합니다. SqlSession 개체가 사라지면 MyBatis의 레벨 1 캐시 정보도 사라집니다.
첫 번째 수준 캐시 비우기를 트리거하는 상황 :
- clearCache () : 캐시 지우기
- 데이터 변경 : 첫 번째 레벨 캐시는 SqlSession 범위 내의 캐시입니다. SqlSession의 수정, 삭제, 추가, commit (), close () 및 기타 메소드가 호출되면 첫 번째 레벨 캐시가 지워집니다.
첫 번째 레벨 캐시의 범위는 SESSION 및 STATEMENT입니다. 기본값은 SESSION입니다. 첫 번째 레벨 캐시를 사용하지 않으려면 첫 번째 레벨 캐시의 범위를 STATEMENT로 지정하여 첫 번째 캐시가 레벨 캐시는 매퍼의 명령문이 실행될 때마다 캐시됩니다.
첫 번째 레벨 캐시의 범위를 변경해야하는 경우 Mybatis 구성 파일의 localCacheScope에서 지정할 수 있습니다. 다음과 같이 :
<setting name="localCacheScope" value="STATEMENT"/>
3. 레벨 2 캐시
2 단계 캐시는 동일한 네임 스페이스 아래의 매퍼를 의미하며 2 단계 캐시에는 맵 구조도 있으며이 영역은 1 단계 캐시 영역입니다. 첫 번째 레벨 캐시의 키는 SQL 문, 조건 및 명령문과 같은 정보로 구성된 고유 한 값입니다. 첫 번째 수준 캐시의 값은 쿼리의 결과 개체입니다.
사용 단계 :
(1) SqlMapperConfig.xml에서 보조 캐시를 엽니 다.
<setting name="cacheEnabled" value="true" />
(2) 매퍼 매핑 파일에서 두 번째 수준 캐시를 엽니 다.
<cache eviction="FIFO" flushInterval="60000" size="512"
readOnly="true"/>
속성 설명 :
매개 변수 이름 | 속성 |
---|---|
축출 | 후퇴 전략 |
flushInterval | 새로 고침 간격 |
크기 | 참조 수 |
readOnly | 읽기 전용 |
제거의 다양한 매개 변수 속성 정보 :
매개 변수 이름 | 속성 |
---|---|
eviction = "LRU" | 가장 최근에 사용한 항목 : 가장 오랫동안 사용하지 않은 개체를 제거합니다. (기본) |
eviction = "FIFO" | 선입 선출 : 캐시에 들어가는 순서대로 개체를 제거합니다. |
eviction = "소프트" | 소프트 참조 : 가비지 수집기 상태 및 소프트 참조 규칙에 따라 개체를 제거합니다. |
eviction = "WEAK" | 약한 참조 : 가비지 수집기 상태 및 약한 참조 규칙에 따라 개체를보다 적극적으로 제거합니다. |
(3) 현재 작업이 선택 태그 (useCache = "true")에서 보조 캐시 구성을 지원하도록합니다.
예:
(1) SqlMapperConfig.xml에서 보조 캐시를 엽니 다.
<setting name="cacheEnabled" value="true" />
(2) userMapper 매핑 파일에서 두 번째 수준 캐시를 엽니 다.
<cache></cache>
(3) 현재 작업이 보조 캐시를 지원하도록합니다.
<!-- 根据id查询用户 -->
<select id="findById" parameterType="Integer" resultType="com.day1.entity.User" useCache="true">
select * from t_user where id = #{id}
</select>
테스트 후 실행 결과는 다음과 같습니다.
요약하자면 :
mybatis의 첫 번째 수준 캐시는 SqlSession 수준 캐시이고 첫 번째 수준 캐시는 개체를 캐시합니다. SqlSession이 제출, 닫기 및 데이터베이스 업데이트를위한 기타 작업이 발생하면 첫 번째 수준 캐시가 비워집니다.
두 번째 수준 캐시는 SqlSessionFactory 수준 캐시입니다. 동일한 SqlSessionFactory에서 생성 된 SqlSession은 두 번째 수준 캐시를 공유합니다. 데이터는 두 번째 수준 캐시에 저장됩니다. 두 번째 수준 캐시에 도달하면 개체가 저장된 데이터. 데이터를 쿼리 할 때 쿼리 프로세스는 수준 2 cache> 수준 1 cache> database 입니다.
4. 오류 요약
错误 信息 : 원인 : org.apache.ibatis.cache.CacheException : 객체 직렬화 오류. 원인 : java.io.NotSerializableException : com.day1.entity.User
이유 : 엔티티 클래스 User가 직렬화 인터페이스를 구현하지 않습니다. MyBatia의 보조 캐시는 객체를 생성하기 위해 역 직렬화해야하는 데이터를 저장합니다.
솔루션 : 사용자가 직렬화 인터페이스를 구현하도록합니다.