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对应的属性,但对于第二步却无法一次性而出现问题。

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

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

转载于:https://www.cnblogs.com/Noctis/p/10712774.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值