• MyBatis中二级缓存和延时加载同时开启的问题


    首先,二级缓存默认不开启!

    要配置 <setting name="cacheEnabled" value="true"/>

    在MyBatis中:一级缓存会维护一个HashMap,keyhashcode+statementId+sql语句,Value为查询出来的结果集映射成的java对象。作用域是SqlSession

    二级缓存是namespace级的,还需要在配置文件处配置缓存<cache/>

    在配置了分布查询

     1 <select id="selectEmployees" resultMap="emps">
     2         select id,last_name,gender,descr,did from employee  
     3 </select>
     4     
     5 <resultMap type="com.atguigu.bean.Employee" id="emps">
     6         <id column="id" property="id"/>
     7         <result column="last_name" property="lastName"/>
     8         <result column="gender" property="gender"/>
     9         <result column="descr" property="descr"/>
    10         
    11         <association property="dept" select="com.atguigu.mapper.DepartmentMapper.selectDepartmentById" 
    12             column="{id=did}"></association>
    13 </resultMap>

    和延时加载后

    1 <setting name="lazyLoadingEnabled" value="true"/>
    2 <setting name="aggressiveLazyLoading" value="false"/>

    此时刷新查询结果页面会报错

      1   1 type Exception report
      2   2 
      3   3 message javax.el.ELException: Error reading 'dept' on type com.atguigu.bean.Employee_$$_jvst6ff_0
      4   4 
      5   5 description The server encountered an internal error that prevented it from fulfilling this request.
      6   6 
      7   7 exception
      8   8 
      9   9 org.apache.jasper.JasperException: javax.el.ELException: Error reading 'dept' on type com.atguigu.bean.Employee_$$_jvst6ff_0
     10  10     org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:561)
     11  11     org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:477)
     12  12     org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
     13  13     org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
     14  14     javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
     15  15     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
     16  16     org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
     17  17     org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:266)
     18  18     org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1225)
     19  19     org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1012)
     20  20     org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
     21  21     org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
     22  22     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)
     23  23     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822)
     24  24     javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
     25  25     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
     26  26     javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
     27  27     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
     28  28     org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
     29  29     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
     30  30     org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
     31  31     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
     32  32 root cause
     33  33 
     34  34 javax.el.ELException: Error reading 'dept' on type com.atguigu.bean.Employee_$$_jvst6ff_0
     35  35     javax.el.BeanELResolver.getValue(BeanELResolver.java:110)
     36  36     org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
     37  37     org.apache.el.parser.AstValue.getValue(AstValue.java:184)
     38  38     org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
     39  39     org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:950)
     40  40     org.apache.jsp.pages.list_jsp._jspx_meth_c_005fforEach_005f0(list_jsp.java:212)
     41  41     org.apache.jsp.pages.list_jsp._jspService(list_jsp.java:124)
     42  42     org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
     43  43     javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
     44  44     org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
     45  45     org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
     46  46     org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
     47  47     javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
     48  48     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
     49  49     org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
     50  50     org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:266)
     51  51     org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1225)
     52  52     org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1012)
     53  53     org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
     54  54     org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
     55  55     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)
     56  56     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822)
     57  57     javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
     58  58     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
     59  59     javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
     60  60     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
     61  61     org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
     62  62     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
     63  63     org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
     64  64     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
     65  65 root cause
     66  66 
     67  67 org.apache.ibatis.executor.ExecutorException: Cannot get Configuration as configuration factory was not set.
     68  68     org.apache.ibatis.executor.loader.ResultLoaderMap$LoadPair.getConfiguration(ResultLoaderMap.java:220)
     69  69     org.apache.ibatis.executor.loader.ResultLoaderMap$LoadPair.load(ResultLoaderMap.java:191)
     70  70     org.apache.ibatis.executor.loader.AbstractEnhancedDeserializationProxy.invoke(AbstractEnhancedDeserializationProxy.java:78)
     71  71     org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedDeserializationProxyImpl.invoke(JavassistProxyFactory.java:186)
     72  72     com.atguigu.bean.Employee_$$_jvst6ff_0.getDept(Employee_$$_jvst6ff_0.java)
     73  73     sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     74  74     sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
     75  75     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     76  76     java.lang.reflect.Method.invoke(Method.java:498)
     77  77     javax.el.BeanELResolver.getValue(BeanELResolver.java:99)
     78  78     org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
     79  79     org.apache.el.parser.AstValue.getValue(AstValue.java:184)
     80  80     org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
     81  81     org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:950)
     82  82     org.apache.jsp.pages.list_jsp._jspx_meth_c_005fforEach_005f0(list_jsp.java:212)
     83  83     org.apache.jsp.pages.list_jsp._jspService(list_jsp.java:124)
     84  84     org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
     85  85     javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
     86  86     org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
     87  87     org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
     88  88     org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
     89  89     javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
     90  90     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
     91  91     org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
     92  92     org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:266)
     93  93     org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1225)
     94  94     org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1012)
     95  95     org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
     96  96     org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
     97  97     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)
     98  98     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822)
     99  99     javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    100 100     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
    101 101     javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    102 102     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    103 103     org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    104 104     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
    105 105     org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    106 106     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
    107 107 note The full stack trace of the root cause is available in the Apache Tomcat/7.0.79 logs.
    错误页面

    这可能是由于第一次查询将结果保存在了二级缓存中,在第二次查询时,由于设置了延时加载,在缓存中只查到了Employee对应的属性,但对于第二步却无法一次性而出现问题。

    解决办法是关闭二级缓存。

    (问别人的时候还以为二级缓存默认开启真鸡儿丢人)

  • 相关阅读:
    [RxSwift]4.4、Operator
    [RxSwift]4.3.6、ControlProperty
    [RxSwift]4.3.5、Variable (已弃用)
    [RxSwift]4.3.0、Observable & Observer 既是可监听序列也是观察者
    [RxSwift]4.2.2、Binder
    [RxSwift]4.2.1、AnyObserver
    Java重温学习笔记,Java8新特性:接口的默认方法
    Tomcat下,MySQL连接池的配置和使用(Tomcat9,MySQL5.5)
    MyEclipse2020配置JDK1.8及Tomcat9
    Java重温学习笔记,Java7新特性
  • 原文地址:https://www.cnblogs.com/Noctis/p/10712774.html
Copyright © 2020-2023  润新知