您好,登錄后才能下訂單哦!
MyBatis中允許使用緩存,分為一級緩存和二級緩存,下面看下MyBatis中如何配置緩存。
ps:下面代碼省略主配置文件和sql映射文件,直接給出測試方法。
public class MyBatisTest {
// 獲取SqlSessionFactory對象
private SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 兩級緩存:
* 一級緩存:(本地緩存), 在SqlSession上的緩存, 一級緩存一直開啟;sqlSession級別的一個Map
* 1. 與數據庫同一次會話期間查詢到的數據會放在本地緩存中,以后如果需要獲取相同的數據,沒有必要在查詢數據庫
*
* 2. 一級緩存失效的情況(沒有使用到當前一級緩存的情況,效果就是,還需要再向數據庫發出查詢)
* 1. sqlSession不同
* 2. sqlSession相同,查詢條件不同(當前緩存中還沒有這個數據)
* 3. sqlSession相同,兩次查詢之間執行了增刪改操作(這次增刪改可能對當前數據有影響)
* 4. sqlSession相同,手動清除了一級緩存(緩存清空)
*
* 二級緩存:(全局緩存), 在SqlSessionFactory上的緩存,基于namespace級別的緩存,一個namespace對應一個二級緩存
* 1. 工作機制:
* 1、一個會話,查詢一條數據,這個數據就會被放在當前會話的一級緩存中;
* 2、如果會話關閉,一級緩存中的數據會被保存到二級緩存中,新的會話查詢信息,就可以參照二級緩存中的內容;
* 3、不同namespace查出的數據會放在自己對應的map(緩存)中
*
* 2. 使用:
* 1、開啟全局二級緩存設置:
* 2、去mapper.xml中進行配置
* 3、我們的POJO需要實現序列化接口
*
* 3. 效果:
* 數據會從二級緩存中獲取;只有會話提交或關閉后,一級緩存中的數據才會轉移到二級緩存中
*
* @throws IOException
*/
//測試二級緩存
@Test
public void testSecondLevelCache() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
SqlSession openSession2 = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);
Employee emp01 = mapper.getEmployeeById(3);
System.out.println(emp01);
openSession.close();
//第二次查詢是從二級緩存中拿到的數據,并沒有發送新的sql
Employee emp02 = mapper2.getEmployeeById(3);
System.out.println(emp02);
System.out.println(emp01 == emp02);
} finally {
openSession2.close();
}
}
//測試一級緩存
@Test
public void testFirstLevelCache() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee emp01 = mapper.getEmployeeById(3);
System.out.println(emp01);
Employee emp02 = mapper.getEmployeeById(3);
System.out.println(emp02);
System.out.println(emp01 == emp02);
} finally {
openSession.close();
}
}
}
敲重點:二級緩存的配置
1、 在主配置文件中開啟二級緩存總開關
2、sql映射文件中開啟二級緩存
3、POJO實現序列化接口
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。