这里讲解的都是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>
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