1. Что такое кеш mybatis:
Чтобы избежать частого взаимодействия с базой данных, Mybatis поддерживает кэширование, по умолчанию он включает только кеш первого уровня, а кеш второго уровня нужно контролировать конфигурацией.
Кэш уровня 1: кеш уровня 1 относится только к одному и тому же SqlSession,тот самыйSqlSessonObject, в случае, если параметры и SQL полностью совпадают, оператор SQL выполняется только один раз, а последующие результаты выбираются из кэша первого уровня. В sqlSession кэш первого уровня запускается только тогда, когда оператор sql и параметры полностью согласованы.
Кэш L2: Кэш L2 предназначен для NameSpace,Несколько сеансов sql выполняют оператор sql одного и того же преобразователя, несколько сеансов sql могут совместно использовать кеш второго уровня, а полученные данные будут храниться в области кеша второго уровня., он не включен по умолчанию, его можно настроитьфайл конфигурации mybatis-config.xml для глобального открытия
<settings>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
Затем настройте, следует ли включать кеш L2 отдельно для каждого *Mapper.xml.
<!--开启本Mapper的namespace下的二级缓存-->
<cache eviction="LRU" flushInterval="10000"/>
Чтобы использовать кеш второго уровня, вам необходимо сериализовать тип сущности POJO и реализовать интерфейс Serializable.
Вторичный кеш mybatis в основном предназначен для случаев, когда имеется много запросов на запросы, и пользователи не предъявляют высоких требований к результатам запросов в реальном времени, он может уменьшить объем доступа к базе данных и повысить скорость доступа.в состоянии пройтиflushIntervalДоступ к конфигурации для управления временем обновления кэша.
Два: шаг на предпосылке
Используйте инструменты mybatis и pagination для запросов на подкачку. При этом запрос на подкачку находится под одной и той же транзакцией, то есть под одним и тем же объектом SqlSession, а интерфейс запроса подкачки вызывается циклически.
Результатом запроса является то, что результат каждого запроса цикла один и тот же, независимо от того, к какой странице выполняется цикл, результатом является значение первого запроса, а оператор запроса sql вызывается только один раз через запрос журнала. Думаю, причина в кеше mybatis.
3. Анализ причин и решение:
Причина: этот проект в настоящее время не показывает, что кеш второго уровня включен, поэтому используется кеш первого уровня mybatis по умолчанию.Поскольку несколько запросов находятся в рамках одной и той же транзакции, используется один и тот же объект SqlSession. Предпосылка, что кеш первого уровня вступает в силу, заключается в том, что в sqlSession он будет запущен только тогда, когда оператор sql и параметры полностью согласованы, то есть параметры разбиения по страницам, установленные инструментом разбиения по страницам, не вступают в силу.
Фактически, в процессе вызова отладки мы также видим, что сначала обращаемся к кешу первого уровня, чтобы получить кешированные результаты соответствующих операторов запроса.В то же самоеSqlSession
, Mybatis выполнит метод и параметры для создания кэшированного значения ключа с помощью алгоритма и сохранит значение ключа и результат на карте.Если последующее значение ключа такое же, он будет напрямую получать данные из карты,Если кэшированный результат, полученный от Map, равен нулю, оператор запроса на подкачку будет перехвачен перехватчиком подкачки, затем установите параметры подкачки и, наконец, вызовите оператор запроса. Результаты не могут быть получены в следующих запросах подкачки. Результаты будут получается в кеше первого уровня, так как параметры подкачки не заданы, а остальные параметры совпадают, поэтому ключи сгенерированных операторов запроса одинаковы, поэтому соответствующее значение кеша можно получить из карты.
решение:
1. Удалите аннотацию @Transactional и удалите транзакцию, тогда каждый запрос на подкачку создает новый объект sqlSession.В кеше первого уровня кеши разных объектов sqlSession изолированы, поэтому ключи, сгенерированные в соответствии с оператором sql, не могут быть запрошены , Результаты кэшируются, поэтому оператор запроса будет выполняться напрямую, чтобы получить результаты из базы данных.
2. Очистите кеш, используйте тег flushCache, чтобы принудительно обновить кеш (кэш первого уровня и кеш второго уровня).
<select id="selectPage" parameterType="java.lang.Integer",flushCache="true">
<select id="selectPage" parameterType="java.lang.Integer",flushCache="true">
Соответствующий кэш очищается после каждого запроса инструкции. Это необходимо для активного отображения обновления с помощью оператора.Конечно, операторы обновления вставки, обновления и удаления также могут обновлять кеш.
Четыре: Резюме
1. Кэш первого уровня в mybatis включен по умолчанию, а кеш второго уровня по умолчанию не включен, кеш первого уровня для sqlSeesion, а кеш второго уровня для nameSpace, который может быть общий для нескольких SqlSessions.
2. Для кеша первого уровня в том же SqlSession Mybatis сгенерирует кешированное значение ключа выполняемого метода и параметров с помощью алгоритма и сохранит значение ключа и результат в карте.Если последующее значение ключа такое же , затем Получить данные непосредственно с карты.
3. Кэши между разными SqlSessions изолированы друг от друга, и кэш можно принудительно обновить с помощью тега flushCache.
Конечно, любой оператор UPDATE, INSERT, DELETE также очистит кеш.