• SpringBank 开发日志 Mybatis 使用redis 作为二级缓存时,无法通过cacheEnabled=false 将其关闭


    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <settings>
            <!-- 是否开启二级缓存 默认为true -->
            <setting name="cacheEnabled" value="false"/>
            <!-- 是否懒加载 -->
            <setting name="lazyLoadingEnabled" value="false" />
        </settings>
    </configuration>

    即使如此,当我的mappler里面有<cache type="com.springbank.dao.support.cache.redis.RedisCache" />,查询这张表时,我发现mybatis仍然去查询redis

    ### Error querying database.  Cause: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is java.lang.NullPointerException
    ### Cause: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is java.lang.NullPointerException
    	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434)
    	... 18 more
    Caused by: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is java.lang.NullPointerException
    	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:198)
    	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:345)
    	at com.springbank.dao.support.cache.redis.RedisCache.getObject(RedisCache.java:62)
    	at org.apache.ibatis.cache.decorators.LoggingCache.getObject(LoggingCache.java:57)
    	at org.apache.ibatis.cache.decorators.TransactionalCache.getObject(TransactionalCache.java:68)
    	at org.apache.ibatis.cache.TransactionalCacheManager.getObject(TransactionalCacheManager.java:35)
    	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:101)
    	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
    	... 25 more
    Caused by: java.lang.NullPointerException
    	at redis.clients.jedis.BinaryJedis.<init>(BinaryJedis.java:101)
    	at redis.clients.jedis.Jedis.<init>(Jedis.java:78)
    	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:193)

     根据异常栈,在CachingExecutor.java:101 看到如下代码

    @Override
      public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)
          throws SQLException {
        Cache cache = ms.getCache();
        if (cache != null) {
          flushCacheIfRequired(ms);
          if (ms.isUseCache() && resultHandler == null) {
            ensureNoOutParams(ms, parameterObject, boundSql);
            @SuppressWarnings("unchecked")
            List<E> list = (List<E>) tcm.getObject(cache, key);
            if (list == null) {
              list = delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
              tcm.putObject(cache, key, list); // issue #578 and #116
            }
            return list;
          }
        }
        return delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
      }

    于是我想,这里cache变量要是null就好了

    ======================================以上都是无用功======================================

    好吧,我发现我错怪mybatis了,最后我发现我的mybatis-config.xml文件根本没有生效

    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="configLocation" value="classpath:mybatis-config.xml" />
            <property name="mapperLocations">
                <list>
                    <value>classpath*:com/springbank/dao/generate/mapper/*.xml</value>
                    <value>classpath*:com/springbank/dao/extend/mapper/*.xml</value>
                </list>
            </property>
        </bean>

    而没有生效的原因就是我忘记了配上面红色部分

  • 相关阅读:
    EntityFramework 在实际开发做项目架构的一点疑问
    应用运筹学4Danzig Wolfe Decomposition
    应用运筹学2 约束优化
    应用运筹学3Benders Decomposition
    应用运筹学1 变量使用
    11组Beta冲刺5/5
    11组Beta冲刺3/5
    11组Beta冲刺4/5
    11组Alpha冲刺总结
    11组Beta冲刺1/5
  • 原文地址:https://www.cnblogs.com/heben/p/7262574.html
Copyright © 2020-2023  润新知