转载的一篇文章。
出于新项目一定要求要用jsp,让我这个习惯写窗体应用程序的去搞web开发,让我好生为难。半路出家,遇到问题很多,转载些文章,自己顺便修改些,留备忘。
说意义不大是在于:
a、面对一定规模的数据量,内置的cache方式就派不上用场了;
b、对查询结果集做缓存并不是MyBatis框架擅长的,它专心做的应该是sql mapper。采用此框架的Application去构建缓存更合理,比如采用OSCache、Memcached啥的。
一、MyBatis的Cache配置
1、全局开关:默认是true,如果它配成false,其余各个Mapper XML文件配成支持cache也没用。
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
2、各个Mapper XML文件,默认是不采用cache。在配置文件加一行就可以支持cache:
<cache /> 就这个网上找了个java应用程序的例子,用的是<cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>或者<cache type="org.mybatis.caches.ehcache.EhcacheCache"/> ,然后我把这个缓存功能也弄到自己的web中,老报错:
org.apache.jasper.JasperException: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in yeah/person.xml ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.RuntimeException: Error parsing Mapper XML. Cause: org.apache.ibatis.cache.CacheException: Could not instantiate cache implementation (class org.mybatis.caches.ehcache.EhcacheCache). Cause: java.lang.reflect.InvocationTargetException org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:722)一堆错误,底下还有。直接换成 <cache />就ok了,在看到这篇文章说MyBatis的Cache意义不大,我看还是算了不折腾这个了,没那么多闲工夫。
3、Mapper XML文件配置支持cache后,文件中所有的Mapper statement就支持了。此时要个别对待某条,需要:
<select id="inetAton" parameterType="string" resultType="integer" useCache=“false” >
select inet_aton(#{name})
</select>
二、注意的几个细节
1、如果readOnly为false,此时要结果集对象是可序列化的。
<cache readOnly="false"/>
2、在SqlSession未关闭之前,如果对于同样条件进行重复查询,此时采用的是local session cache,而不是上面说的这些cache。