"Серия Mybatis" Тайник Mybatis

задняя часть
"Серия Mybatis" Тайник Mybatis

Эта серия статей GithubРасширенное руководство по серверной частиОн был включен, этот проект совершенствуется, добро пожаловать в звезду.

1. Введение в кеш

Предоставлено Mybatisкэш запросов, если в кэше есть данные, их не нужно получать из базы данных, что используется для уменьшения давления данных и повышения производительности системы.

Mybatis запросЕсть два уровня кэша, мы называем кэш L1 и кэш L2:

  • Кэш L1 естьУровень SqlSessionкеш. При работе с базой данных необходимо построить объект sqlSession, а в объекте имеется структура данных (HashMap) для хранения кэшированных данных. Кэшированные области данных (HashMap) между разными sqlSessions не влияют друг на друга.

  • Кэш второго уровня — это кеш уровня Mapper (пространства имен). Несколько сеансов SqlSessions управляют оператором sql одного и того же Mapper.Несколько сеансов SqlSessions могут совместно использовать кэш второго уровня, а кэш второго уровня находится между сеансами SqlSessions.

2. Кэш первого уровня

Mybatis по умолчанию включает кеш первого уровня

img
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, а транзакция контролируется в сервисе.

Метод службы включает в себя множество вызовов метода сопоставления:

service{
    //开始执行时,开启事务,创建SqlSession对象
    //第一次调用mapper的方法findUserById(1)

    //第二次调用mapper的方法findUserById(1),从一级缓存中取数据
    //方法结束,sqlSession关闭
}

Если для запроса одной и той же информации о пользователе выполняются два вызова службы, кэш первого уровня не используется, поскольку метод преобразователя завершается, сеанс sqlSession закрывается, а кэш первого уровня очищается.

3. Кэш второго уровня

3.1 Принцип

Кэш второго уровня находится на уровне преобразователя (пространства имен).

img
img

инструкция:

  1. Первый вызов SQL в Mapper для запроса информации о пользователе. Запрошенная информация будет храниться в соответствующем картографе.Кэш-память второго уровняВнутри.
  2. Второй раз вызывает тот же SQL в файле сопоставления преобразователя в том же пространстве имен для запроса информации о пользователе. Результат будет извлечен из соответствующего кеша L2.
  3. Если вы вызовете добавление, удаление и изменение SQL в файле сопоставления картографа в одном и том же пространстве имен и выполните операцию фиксации. В это время кэш второго уровня в пространстве имен будет очищен.

3.2 Включить кеш L2

Mybatis не открывает кеш второго уровня по умолчанию, шаги для его открытия следующие:

  1. Добавьте следующее содержимое в основной файл конфигурации SqlMapConfig.xml (включите главный переключатель кэша второго уровня):
<!-- 开启二级缓存总开关 -->
<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>
  1. В файл сопоставления UserMapper добавьте следующее, чтобы включить кеш второго уровня:
<!-- 开启本mapper下的namespace的二级缓存,默认使用的是mybatis提供的PerpetualCache -->
<cache></cache>

3.3 Реализовать сериализацию

Так как данные кэша второго уровня не обязательно хранятся в памяти, а носители их хранения различны, например, хранятся в файловой системе, то необходимо сериализовать кэшированные объекты. Если у класса есть родительский класс, то родительский класс также должен реализовывать сериализацию.

3.4 Тест 1

@Test
    public void testTwoLevelCache() {
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        SqlSession sqlSession3 = sqlSessionFactory.openSession();

        UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
        UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
        UserMapper mapper3 = sqlSession3.getMapper(UserMapper.class);
        // 第一次查询ID为1的用户,去缓存找,找不到就去查找数据库
        User user1 = mapper1.findUserById(1);
        System.out.println(user1);
        // 关闭SqlSession1
        sqlSession1.close();

        // 第二次查询ID为1的用户
        User user2 = mapper2.findUserById(1);
        System.out.println(user2);
        // 关闭SqlSession2
        sqlSession2.close();
    }

3.5 Тест 2

@Test
    public void testTwoLevelCache() {
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        SqlSession sqlSession3 = sqlSessionFactory.openSession();

        UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
        UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
        UserMapper mapper3 = sqlSession3.getMapper(UserMapper.class);
        // 第一次查询ID为1的用户,去缓存找,找不到就去查找数据库
        User user1 = mapper1.findUserById(1);
        System.out.println(user1);
        // 关闭SqlSession1
        sqlSession1.close();

        //修改查询出来的user1对象,作为插入语句的参数
        user1.setUsername("隔壁老詹1");
        user1.setAddress("洛杉矶湖人");

        mapper3.insertUser(user1);

        // 提交事务
        sqlSession3.commit();
        // 关闭SqlSession3
        sqlSession3.close();

        // 第二次查询ID为1的用户
        User user2 = mapper2.findUserById(1);
        System.out.println(user2);
        // 关闭SqlSession2
        sqlSession2.close();
    }

3.6 Отключить кеш L2

Гранулярность кэша второго уровня по умолчанию находится на уровне 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 не подходит для мелкозернистого кэширования на уровне данных.

  • Сцены:

    Кэшировать информацию о продукте. Из-за большого количества посещений запросов информации о продукте пользователям необходимо каждый раз запрашивать последнюю информацию о продукте. В настоящее время, если используется кеш второго уровня, невозможно только обновить кешированную информацию. продукта, когда продукт изменяется. Он не обновляет другую информацию кэша продукта, потому что кэш второго уровня является уровнем картографа. Когда информация о продукте обновляется, все данные кэша информации о продукте будут очищены.

  • Решение

    Такие проблемы требуют целенаправленного кэширования данных на бизнес-слое по мере необходимости.

    Например, часто изменяющиеся операции с данными можно поместить в средство сопоставления другого пространства имен.

Эта серия статей GithubРасширенное руководство по серверной частиОн был включен, этот проект совершенствуется, добро пожаловать в звезду.

Все статьи в официальном аккаунте написаны авторами блогов и будут постоянно обновляться. Если вы хотите стать свидетелем или расти вместе с блоггерами, добро пожаловать на внимание!