Просмотр исходного кода

去除isSearchCount,减少数据缓存.

聂秋秋 5 лет назад
Родитель
Сommit
dc921d421d

+ 0 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/executor/AbstractBaseExecutor.java

@@ -61,8 +61,6 @@ public abstract class AbstractBaseExecutor extends BaseExecutor {
                 IPage<?> page = (IPage) optional.get().getValue();
                 offset = page.getCurrent();
                 limit = page.getSize();
-                //折磨人的小妖精,只能当缓存条件了,避免缓存错误命中.
-                cacheKey.update(page.isSearchCount());
             }
         } else if (parameterObject instanceof IPage) {
             IPage<?> page = (IPage) parameterObject;

+ 9 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/executor/MybatisCachingExecutor.java

@@ -140,7 +140,8 @@ public class MybatisCachingExecutor implements Executor {
                         return new PageList(records, page.getTotal());
                     } else {
                         result = delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
-                        tcm.putObject(cache, key, result); // issue #578 and #116
+                        // issue #578 and #116
+                        tcm.putObject(cache, key, result);
                         return (List<E>) result;
                     }
                 } else {
@@ -148,9 +149,15 @@ public class MybatisCachingExecutor implements Executor {
                         if (page.isSearchCount()) {
                             CacheKey cacheKey = getCountCacheKey(ms, boundSql, parameterObject, RowBounds.DEFAULT);
                             Number count = (Number) tcm.getObject(cache, cacheKey);
-                            // 正常的缓存操作来的话,这里是不会出现list有count没有的情况。
                             if (count != null) {
+                                page.hitCount(true);
                                 return new PageList((List) result, count.longValue());
+                            } else {
+                                // 某些特殊情况,比如先不查count,缓存了list数据或者count缓存数据被淘汰(这几率比较小),就再查一次算了。
+                                result = delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
+                                List<E> records = (List<E>) result;
+                                tcm.putObject(cache, cacheKey, page.getTotal());
+                                return new PageList(records, page.getTotal());
                             }
                         }
                         return new PageList((List) result, 0L);

+ 12 - 3
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/cache/CacheTest.java

@@ -32,39 +32,48 @@ class CacheTest {
     void testPageCache() {
         Cache cache = getCache();
         IPage<CacheModel> cacheModelIPage1 = cacheService.page(new Page<>(1, 3), new QueryWrapper<>());
+        Assertions.assertFalse(cacheModelIPage1.isHitCount());
         IPage<CacheModel> cacheModelIPage2 = cacheService.page(new Page<>(1, 3), new QueryWrapper<>());
-        //count+list
+        Assertions.assertTrue(cacheModelIPage2.isHitCount());
         Assertions.assertEquals(cache.getSize(), 2);
         Assertions.assertEquals(cacheModelIPage1.getTotal(), cacheModelIPage2.getTotal());
         Assertions.assertEquals(cacheModelIPage1.getRecords().size(), cacheModelIPage2.getRecords().size());
         IPage<CacheModel> cacheModelIPage3 = cacheService.page(new Page<>(2, 3), new QueryWrapper<>());
+        Assertions.assertTrue(cacheModelIPage3.isHitCount());
         Assertions.assertEquals(cacheModelIPage1.getTotal(), cacheModelIPage3.getTotal());
         Assertions.assertEquals(cacheModelIPage3.getRecords().size(), 2);
-        //count语句命中,list翻页
         Assertions.assertEquals(cache.getSize(), 3);
         IPage<CacheModel> cacheModelIPage4 = cacheService.page(new Page<>(2, 3, false), new QueryWrapper<>());
+        Assertions.assertFalse(cacheModelIPage4.isHitCount());
         Assertions.assertEquals(cacheModelIPage4.getTotal(), 0L);
         Assertions.assertEquals(cacheModelIPage4.getRecords().size(), 2);
-        Assertions.assertEquals(cache.getSize(), 4);
+        Assertions.assertEquals(cache.getSize(), 3);
         IPage<CacheModel> cacheModelIPage5 = cacheService.page(new Page<>(2, 3, true), new QueryWrapper<>());
+        Assertions.assertTrue(cacheModelIPage5.isHitCount());
         Assertions.assertEquals(cacheModelIPage5.getTotal(), cacheModelIPage3.getTotal());
         Assertions.assertEquals(cacheModelIPage5.getRecords().size(), 2);
         IPage<CacheModel> cacheModelIPage6 = cacheService.page(new Page<>(1, 3, true), new QueryWrapper<CacheModel>().ge("id", 2L));
+        Assertions.assertFalse(cacheModelIPage6.isHitCount());
         Assertions.assertEquals(cacheModelIPage6.getTotal(), 4);
         Assertions.assertEquals(cacheModelIPage6.getRecords().size(), 3);
         IPage<CacheModel> cacheModelIPage7 = cacheService.page(new Page<>(1, 3, false), new QueryWrapper<CacheModel>().ge("id", 2L));
+        Assertions.assertFalse(cacheModelIPage7.isHitCount());
         Assertions.assertEquals(cacheModelIPage7.getTotal(), 0L);
         Assertions.assertEquals(cacheModelIPage7.getRecords().size(), 3);
         IPage<CacheModel> cacheModelIPage8 = cacheService.page(new Page<>(1, 3, false), new QueryWrapper<CacheModel>().ge("id", 3L));
+        Assertions.assertFalse(cacheModelIPage8.isHitCount());
         Assertions.assertEquals(cacheModelIPage8.getTotal(), 0L);
         Assertions.assertEquals(cacheModelIPage8.getRecords().size(), 3);
         cacheModelIPage8 = cacheService.page(new Page<>(1, 3, false), new QueryWrapper<CacheModel>().ge("id", 3L));
+        Assertions.assertFalse(cacheModelIPage8.isHitCount());
         Assertions.assertEquals(cacheModelIPage8.getTotal(), 0L);
         Assertions.assertEquals(cacheModelIPage8.getRecords().size(), 3);
         IPage<CacheModel> cacheModelIPage9 = cacheService.page(new Page<>(1, 3, true), new QueryWrapper<CacheModel>().ge("id", 3L));
+        Assertions.assertFalse(cacheModelIPage9.isHitCount());
         Assertions.assertEquals(cacheModelIPage9.getTotal(), 3L);
         Assertions.assertEquals(cacheModelIPage9.getRecords().size(), 3);
         cacheModelIPage9 = cacheService.page(new Page<>(1, 3, true), new QueryWrapper<CacheModel>().ge("id", 3L));
+        Assertions.assertTrue(cacheModelIPage9.isHitCount());
         Assertions.assertEquals(cacheModelIPage9.getTotal(), 3L);
         Assertions.assertEquals(cacheModelIPage9.getRecords().size(), 3);
     }