注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

mybatis3 使用注意事项  

来自yfkscu@126   2013-09-12 17:51:27|  分类: MySQL |举报 |字号 订阅

  下载LOFTER 我的照片书  |
这里讲解的都是mybatis3版本的特性,不保证适用其它版本。

1. mybatis缓存使用注意
mybatis自身带有很强大的缓存特性,用户可以通过配置文件进行配置。缓存可以提高mybatis的效率,但使用不当会导致程序的逻辑错误,有些场景我们需要禁掉缓存。
  • mybatis缓存配置有三个部分
    • 全局缓存在mybatis-conf.xml中配置,配置方法<setting name="cacheEnabled" value="true"/>,默认是true
    • mapper文件级别缓存作用域是Mapper XML文件,在配置文件中加一行 <cache/>,设置为true后这个mapper文件中的statement都带有缓存功能了
    • 语句级别缓存是具体的sql语句缓存设置,配置方法如下:<select id="selectByMachineId" flushCache="true" parameterType="Long" resultType="com.netease.nbs.dao.model.BitmapFS">select * from NBS_BitmapFS where machineId = #{machineId}</select>
注意:局部session缓存功能默认是开启的,在这个session中对于同一条sql查询得到的结果相同。这样在如下场景下就会有一个问题。场景:当一个session执行了一条update语句更新了对象A并且commit事物,结下来我想继续用这个session去select最新更新的A,但事与愿违我们拿到的还是更新前的A。所以如果我们在使用上有这样的场景而又想使用缓存,就可以用到语句界别的缓存了(如上述在select语句中加入flushCache="true"),这样这条查询语句就不会用到局部session缓存而是直接从数据库中获取数据。

2. mybatis事物资源泄露问题
mybatis的session接口提供了commit()/commit(boolean)/rollback()/rollback(boolean)这四个接口,在提交或者回滚事物的时候我们要特别注意这借个接口的不同。
  • 默认的commit和rollback语句:如果这个session中有update/delete/insert语句出现的话,事物会真正的被提交或者回滚。但是如果这个session在调用两个函数之前没有这几种语句,很抱歉mybatis会忽略事物的提交或者回滚操作。mybatis这样做的原因可能是它认为没有任何更新语句出现的话根本没有必要提交或者回滚事务,于是乎为了提交性能就悄悄的跳过这一步了。但是在我们的场景中经常会出现select for update语句,如果调用的默认的commit或者rollback之后close掉这个session就会导致mysql服务器端的事物资源一直存活,这将会导致很严重的问题。
  • commit(boolean)/rollback(boolean): 这两个接口用户可以自行控制是否需要强制提交或者回滚事物,设置为true的话则任何情况下都会强制提交或者回滚事物。设置为false的话功能如默认的commit/rollback
  评论这张
 
阅读(982)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017