Cache ialah ruang memori. Ia menyimpan data sementara
membaca data daripada sumber data (pangkalan data atau fail) dan menyimpannya dalam cache Apabila ia diambil semula, ia diperoleh terus daripada cache, yang boleh mengurangkan bilangan interaksi dengan pangkalan data dan meningkatkan prestasi program
Sesuai untuk caching: kerap ditanya tetapi tidak kerap diubah suai (cth: wilayah, bandar, data kategori), ketepatan data tidak mempunyai kesan ke atas keputusan akhir Yang besar
Tidak sesuai untuk caching: data yang kerap berubah, data sensitif (contohnya: harga pasaran saham, kadar pertukaran bank, wang dalam kad bank), dsb.
Cache Tahap 1: Ia adalah cache objek sqlSession Ia disertakan dengannya (tiada konfigurasi diperlukan) dan tidak boleh dinyahpasang (jika anda tidak mahu menggunakannya). . Kitaran hayat cache tahap pertama adalah konsisten dengan sqlSession.
Cache Tahap 2: Ia adalah cache SqlSessionFactory. Selagi SqlSession yang dicipta oleh SqlSessionFactory yang sama berkongsi kandungan cache peringkat kedua, ia boleh mengendalikan cache peringkat kedua. Jika kita ingin menggunakan cache peringkat kedua, kita perlu mendayakannya sendiri secara manual (konfigurasi diperlukan).
1 Dayakan cache tahap kedua dalam fail konfigurasi teras mybatis
<!--**因为 cacheEnabled 的取值默认就为 true**,所以这一步可以省略不配置。为 true 代表开启二级缓存;为 false 代表不开启二级缓存。 --> <settings> <setting name="cacheEnabled" value="true"/> </settings>
2 cache dalam fail pemetaan 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. Kelas Pojo yang akan dicache mesti melaksanakan antara muka Serializable
public class User implements Serializable { private int uid; private String username; private String sex; private Date birthday; private String address; // 省略setter,getter,构造...等方法 }
4. Uji menggunakan cache tahap kedua
Kod ujian
@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(); }
- Keputusan ujian:
- Selepas ujian di atas, kami mendapati bahawa dua pertanyaan telah dilaksanakan, dan selepas melaksanakan pertanyaan pertama, kami mematikan cache peringkat pertama dan kemudian pergi ke Apabila melaksanakan pertanyaan kedua, kami mendapati bahawa tiada pernyataan SQL dikeluarkan kepada pangkalan data, jadi data pada masa ini hanya boleh datang daripada apa yang kami panggil cache peringkat kedua.
5. Uji untuk mematikan cache tahap kedua
- kod ujian
@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(); }
- hasil ujian
Selepas Ujian di atas, kami mendapati bahawa dua pertanyaan telah dilaksanakan, dan selepas melaksanakan pertanyaan pertama, kami menutup cache peringkat pertama dan cache peringkat kedua Apabila kami melaksanakan pertanyaan kedua, kami mendapati bahawa pernyataan sql telah dikeluarkan pangkalan data, jadi Data pada masa ini datang daripada pangkalan data, bukan cache.
Atas ialah kandungan terperinci Cara menggunakan cache peringkat kedua Mybatis di Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!