MyBatis的Cache实际意义不大

转载的一篇文章。

出于新项目一定要求要用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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在Spring Boot中,我们可以使用`@Cacheable`注解来实现MyBatis缓存。以下是一个简单的示例: 1. 添加依赖 在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.1</version> </dependency> ``` 这里我们使用了Ehcache作为缓存提供者。 2. 配置缓存 在`application.properties`文件中添加以下配置: ```properties mybatis.configuration.cache-enabled=true mybatis.configuration.cache-impl=org.mybatis.caches.ehcache.EhcacheCache ``` 这里我们启用了MyBatis缓存,并将缓存实现设置为EhcacheCache。 3. 编写Mapper ```java @Mapper public interface UserMapper { @Cacheable(value = "user", key = "'user_'+#id") User getUserById(Long id); } ``` 在这个示例中,我们使用了`@Cacheable`注解来标记方法,让MyBatis自动缓存查询结果。`value`属性表示缓存的名称,`key`属性表示缓存的键。在这个例子中,我们使用了`id`作为键。 4. 测试 ```java @RunWith(SpringRunner.class) @SpringBootTest public class UserMapperTests { @Autowired private UserMapper userMapper; @Test public void testGetUserById() { Long id = 1L; User user = userMapper.getUserById(id); System.out.println(user); user = userMapper.getUserById(id); System.out.println(user); } } ``` 在这个测试中,我们首先查询了一个用户,然后再次查询同一个用户。由于缓存已经生效,第二次查询将直接从缓存中获取结果。 这就是使用Spring Boot Cache实现MyBatis缓存的简单示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值