Предоставлено Mybatisкэш запросов, если в кэше есть данные, их не нужно получать из базы данных, что используется для уменьшения давления данных и повышения производительности системы.
Mybatis запросЕсть два уровня кэша, мы называем кэш L1 и кэш L2:
Кэш L1 естьУровень SqlSessionкеш. При работе с базой данных необходимо построить объект sqlSession, а в объекте имеется структура данных (HashMap) для хранения кэшированных данных. Кэшированные области данных (HashMap) между разными sqlSessions не влияют друг на друга.
Кэш второго уровня — это кеш уровня Mapper (пространства имен). Несколько сеансов SqlSessions управляют оператором sql одного и того же Mapper.Несколько сеансов SqlSessions могут совместно использовать кэш второго уровня, а кэш второго уровня находится между сеансами SqlSessions.
2. Кэш первого уровня
Mybatis по умолчанию включает кеш первого уровня
img
инструкция:
В первый раз, когда вы инициируете запрос информации о пользователе с идентификатором пользователя 1, сначала выясните, есть ли в кэше информация о пользователе с идентификатором 1. Если нет, запросите информацию о пользователе из базы данных и сохраните запрошенную информацию о пользователе в первом -кеш уровня.
Если промежуточный sqlSession выполняет операцию фиксации (вставка, обновление, удаление), очистите кеш первого уровня в SqlSession, чтобы сохранить самую последнюю информацию в кеше и избежать грязных чтений.
Во второй раз, когда вы инициируете запрос информации о пользователе с идентификатором пользователя 1, сначала выясните, есть ли в кеше информация о пользователе с идентификатором 1. Если есть, получите информацию о пользователе непосредственно из кеша.
2.1 Тест 1
@Test public void testOneLevelCache() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 第一次查询ID为1的用户,去缓存找,找不到就去查找数据库 User user1 = mapper.findUserById(1); System.out.println(user1);
// 第二次查询ID为1的用户 User user2 = mapper.findUserById(1); System.out.println(user2);
sqlSession.close(); }
2.2 Тест 2
@Test public void testOneLevelCache() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 第一次查询ID为1的用户,去缓存找,找不到就去查找数据库 User user1 = mapper.findUserById(1); System.out.println(user1);
User user = new User(); user.setUsername("隔壁老詹1"); user.setAddress("洛杉矶湖人"); //执行增删改操作,清空缓存 mapper.insertUser(user);
// 第二次查询ID为1的用户 User user2 = mapper.findUserById(1); System.out.println(user2);
sqlSession.close(); }
2.3 Специальные приложения
Формальная разработка заключается в интеграции mybatis и spring, а транзакция контролируется в сервисе.
Метод службы включает в себя множество вызовов метода сопоставления:
Если для запроса одной и той же информации о пользователе выполняются два вызова службы, кэш первого уровня не используется, поскольку метод преобразователя завершается, сеанс sqlSession закрывается, а кэш первого уровня очищается.
3. Кэш второго уровня
3.1 Принцип
Кэш второго уровня находится на уровне преобразователя (пространства имен).
img
инструкция:
Первый вызов SQL в Mapper для запроса информации о пользователе. Запрошенная информация будет храниться в соответствующем картографе.Кэш-память второго уровняВнутри.
Второй раз вызывает тот же SQL в файле сопоставления преобразователя в том же пространстве имен для запроса информации о пользователе. Результат будет извлечен из соответствующего кеша L2.
Если вы вызовете добавление, удаление и изменение SQL в файле сопоставления картографа в одном и том же пространстве имен и выполните операцию фиксации. В это время кэш второго уровня в пространстве имен будет очищен.
3.2 Включить кеш L2
Mybatis не открывает кеш второго уровня по умолчанию, шаги для его открытия следующие:
Добавьте следующее содержимое в основной файл конфигурации SqlMapConfig.xml (включите главный переключатель кэша второго уровня):
Так как данные кэша второго уровня не обязательно хранятся в памяти, а носители их хранения различны, например, хранятся в файловой системе, то необходимо сериализовать кэшированные объекты. Если у класса есть родительский класс, то родительский класс также должен реализовывать сериализацию.
Гранулярность кэша второго уровня по умолчанию находится на уровне Mapper, но если запрос в том же файле Mapper не хочет использовать кэш второго уровня, гранулярность управления кэшем должна быть более тонкой.
установить в теге selectuseCache=false, вы можете отключить кеш второго уровня текущего оператора select, то есть каждый запрос является запросом в базе данных,правда по умолчанию, то есть оператор использует кэш второго уровня.
<select id="findUserById" parameterType="int" resultType="com.kkb.mybatis.po.User" useCache="true"> SELECT * FROM user WHERE id = #{id}
</select>
3.7 Обновить кэш L2
С помощью атрибута flushCache вы можете контролировать, будет ли атрибут выбора, вставки, обновления, удаления тегов вторичным кешем
настройки по умолчанию
По умолчанию, если это оператор select, то flushCache имеет значение false.
Если это оператор вставки, обновления, удаления, тогда значение flushCache истинно.
Интерпретация конфигурации по умолчанию
Если оператор запроса имеет значение true, то каждый запрос является запросом к базе данных, что означает, что кэш второго уровня запроса недействителен.
Если для оператора добавления, удаления и модификации установлено значение false, даже если используется кэш второго уровня, то, если данные в базе данных изменены, а кэшированные данные остаются прежними, в это время произойдет грязное чтение.
flushCache устанавливается следующим образом:
<select id="findUserById" parameterType="int" resultType="com.kkb.mybatis.po.User" useCache="true" flushCache="true"> SELECT * FROM user WHERE id = #{id} </select>
3.8 Сценарии применения
используемые сцены:
Для запросов, требующих высокой скорости ответа при доступе, но низкой производительности в режиме реального времени, можно использовать технологию кэширования L2.
Меры предосторожности:
При использовании кэша второго уровня необходимо установитьИнтервал обновления(есть один в теге кешаflashIntervalатрибут) для регулярного обновления кэша второго уровня.Интервал обновления устанавливается в соответствии с конкретными потребностями, например, 30 минут, 60 минут и т. д.в миллисекундах.
3.9 Ограничения
Кэш Mybatis L2 не подходит для мелкозернистого кэширования на уровне данных.
Сцены:
Кэшировать информацию о продукте. Из-за большого количества посещений запросов информации о продукте пользователям необходимо каждый раз запрашивать последнюю информацию о продукте. В настоящее время, если используется кеш второго уровня, невозможно только обновить кешированную информацию. продукта, когда продукт изменяется. Он не обновляет другую информацию кэша продукта, потому что кэш второго уровня является уровнем картографа. Когда информация о продукте обновляется, все данные кэша информации о продукте будут очищены.
Решение
Такие проблемы требуют целенаправленного кэширования данных на бизнес-слое по мере необходимости.
Например, часто изменяющиеся операции с данными можно поместить в средство сопоставления другого пространства имен.
Все статьи в официальном аккаунте написаны авторами блогов и будут постоянно обновляться. Если вы хотите стать свидетелем или расти вместе с блоггерами, добро пожаловать на внимание!