캐시는 임시 데이터를 저장하는 메모리 공간입니다
데이터 소스(데이터베이스 또는 파일)에서 데이터를 읽어 캐시에 저장합니다. 다시 검색할 때 캐시에서 직접 얻으면 데이터베이스와의 상호 작용 횟수가 줄어들어 프로그램 성능이 향상될 수 있습니다!
캐시에 적용 가능: 자주 쿼리되지만 자주 수정되지는 않음( 예: 도시, 카테고리 데이터 저장), 데이터의 정확성은 최종 결과에 거의 영향을 미치지 않습니다.
캐싱에 적합하지 않음: 자주 변경되는 데이터, 민감한 데이터(예: 주식 시장 가격, 은행 환율, 은행 카드 잔액) ) 등 잠깐만요
레벨 1 캐시: sqlSession 개체의 캐시입니다. 함께 제공되며(구성이 필요하지 않음) 제거할 수 없습니다(사용하지 않으려는 경우). 첫 번째 수준 캐시의 수명 주기는 sqlSession과 일치합니다.
레벨 2 캐시: SqlSessionFactory의 캐시입니다. 동일한 SqlSessionFactory에 의해 생성된 SqlSession이 2차 캐시의 내용을 공유하는 한, 2차 캐시를 운영할 수 있습니다. 두 번째 수준 캐시를 사용하려면 직접 수동으로 켜야 합니다(구성이 필요함).
1. mybatis
<!--**因为 cacheEnabled 的取值默认就为 true**,所以这一步可以省略不配置。为 true 代表开启二级缓存;为 false 代表不开启二级缓存。 --> <settings> <setting name="cacheEnabled" value="true"/> </settings>
2의 핵심 구성 파일에서 2차 캐시를 활성화합니다. Dao 매핑 파일
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.dao.UserDao"> <!--配置二级缓存--> <cache/> <select id="findAll" resultType="user"> select * from t_user </select> <delete id="deleteById" parameterType="int"> delete from t_user where uid=#{id} </delete> </mapper>
3에서 2차 캐시 사용을 구성합니다. 캐시할 Pojo 클래스 직렬화 가능 인터페이스를 구현해야 합니다
public class User implements Serializable { private int uid; private String username; private String sex; private Date birthday; private String address; // 省略setter,getter,构造...等方法 }
4. 두 번째 수준 캐시를 사용하여 테스트
테스트 코드
@Test public void testFindAll() throws Exception{ // 1.加载mybatis核心配置文件 InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2.创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 3.构建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); // 4.获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 5.获得dao接口的代理对象 UserDao userDao = sqlSession.getMapper(UserDao.class); // 6.执行sql语句,得到结果 List<User> list = userDao.findAll(); for (User user : list) { System.out.println("user = " + user); } sqlSession.close();//清除一级缓存 System.out.println("分割线----------------------------------"); SqlSession sqlSession2 = sqlSessionFactory.openSession(); UserDao userDao2 = sqlSession2.getMapper(UserDao.class); List<User> userList2 = userDao2.findAll(); for (User user : userList2) { System.out.println(user); } // 7.释放资源 sqlSession2.close(); }
- 테스트 결과:
- 위 테스트 후 두 가지를 발견했습니다. 쿼리가 실행되고 처음 실행되었습니다. 쿼리 후 1차 캐시를 닫았고, 두 번째 쿼리를 실행했을 때 데이터베이스에 SQL 문이 발행되지 않은 것을 확인했습니다. 우리가 두 번째 수준 캐시라고 부르는 것에서 나옵니다.
5. 2차 캐시 끄기 테스트
- 테스트 코드
@Test public void testFindAll() throws Exception{ // 1.加载mybatis核心配置文件 InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2.创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 3.构建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); // 4.获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 5.获得dao接口的代理对象 UserDao userDao = sqlSession.getMapper(UserDao.class); // 6.执行sql语句,得到结果 List<User> list = userDao.findAll(); for (User user : list) { System.out.println("user = " + user); } sqlSession.close();//清除一级缓存 System.out.println("分割线----------------------------------"); SqlSession sqlSession2 = sqlSessionFactory.openSession(); UserDao userDao2 = sqlSession2.getMapper(UserDao.class); userDao2.deleteById(5);// 关闭二级缓存 List<User> userList2 = userDao2.findAll(); for (User user : userList2) { System.out.println(user); } // 7.释放资源 sqlSession2.close(); }
- 테스트 결과
위 테스트 후 두 개의 쿼리가 실행된 것을 확인하였고, 첫 번째 쿼리 실행 후 종료하였습니다. 1차 캐시, 2차 캐시를 끄고 2차 쿼리를 실행하면 데이터베이스에 SQL문이 발행되어 이때의 데이터는 캐시가 아닌 데이터베이스에서 나오는 것을 알 수 있습니다.
위 내용은 Java에서 Mybatis의 두 번째 수준 캐시를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!