设为首页 收藏本站
查看: 943|回复: 0

[经验分享] 为了喷mybatis我下载了mybatis源码

[复制链接]

尚未签到

发表于 2016-11-25 01:03:36 | 显示全部楼层 |阅读模式
  久闻mybatis/ibatis大名今天终于爆发了,找了一堆mybatis的讨论。。。这部分大多是关乎sql写在xml之类的
  看了下mybatis的高速缓存的讨论。。。这部分无不例外的在分享缓存的配置。。。包括缓存实现。。。缓存过期策略。。。
  LRU。。。FIFO。。。
  如果说在xml里面写sql。。并且在上一堆dtd描述。。并且声称这样便于dba维护sql。。可以直接把写好的sql copy到xml里面去。。可以统一管理。 好吧,这些都属于个人习惯,无所谓。
  只不过我在想把这些sql变成方法,例如最简单的一个:


  • <select id=”getUserList” resultMap="UserResult" cacheModel=”user-cache”>  
  •     select * from USER  
  • </select> 
  • 变成:

  • public UserResult getUserList(){
  • return baseDao.find("select * from USER");
  • }
  我了解的太少,还没能看出这样有什么分别。关于这个,我只是有点点疑惑。(当然,你可以把这些写在一个类里面,便于你们的DBA维护)
  。。。。。。。。。
  作为一个ORM框架,除了面向对象查询 如JPA之类的,还有一个不得不提的东西:缓存。
  在我为缓存头痛的时候,我努力的寻找mybatis缓存的做法。毕竟这么多人使用的框架一定可以学习一下缓存的实现。
  在我输入关键词:ibatis 缓存/mybatis 缓存 看过基本上找到并且有时间去看的文章之后,我心里产生了一个疑问:为什么这些人来来去去都是讲的LRU、FIFO这些东西,或者贴出了这么一段精妙绝伦的代码:

  public List query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
if (ms != null) {
Cache cache = ms.getCache();
if (cache != null) {
flushCacheIfRequired(ms);
cache.getReadWriteLock().readLock().lock();
try {
if (ms.isUseCache() && resultHandler == null) {
CacheKey key = createCacheKey(ms, parameterObject, rowBounds);
final List cachedList = (List) cache.getObject(key);
if (cachedList != null) {
return cachedList;
} else {
List list = delegate.query(ms, parameterObject, rowBounds, resultHandler);
tcm.putObject(cache, key, list);
return list;
}
} else {
return delegate.query(ms, parameterObject, rowBounds, resultHandler);
}
} finally {
cache.getReadWriteLock().readLock().unlock();
}
}
}
return delegate.query(ms, parameterObject, rowBounds, resultHandler);
}
  当然,还有不少人画了一些UML例图来给苦难大众讲解 CachingExecutor是如何工作的。
  我不懂UML,也不知道怎么为这些精妙的if else画用例图。我开始走向绝望:“为什么这群人来来去去仅仅关心这些东西?”
  于是乎我下载了mybatis的源码,还好其结构很清晰。我在想“mybatis是如何让缓存过期?”毕竟这个是缓存的关键所在,于是我找到了这个:

  public int update(MappedStatement ms, Object parameterObject) throws SQLException {
flushCacheIfRequired(ms);
return delegate.update(ms, parameterObject);
}
   然后我又看到了这个:

  private void flushCacheIfRequired(MappedStatement ms) {
Cache cache = ms.getCache();
if (cache != null) {
if (ms.isFlushCacheRequired()) {
tcm.clear(cache);
}
}
}
  我很震惊,就这么样的。整个Cache被clear了。很简洁。哦不,是根本不带任何烦杂的处理,干脆利落的干掉了缓存的老巢。
  MappedStatement到底是何方神圣,虽然不知道也没看也看不明白(和传闻中的一样,不带一丝注释),但是据我猜测加上看到的一些mybatis的配置。
  我想mybatis把一个xml/namespace的sqlMap 装进了一个Cache,然后。。。没有然后了。
  这不禁的让我想到了看到的动画片里面感到疑惑不解的是为什么一个小飞船biu的一下巨大的战舰就爆了。
  。。。。。。。。。。。。。。
  对于这种缓存,我想到了这么一个场景。a用户查询得到查询缓存,b用户update自己的东西。a用户的查询缓存又挂了,重新查询得到查询缓存。
  当然,mybatis的缓存是大家的,不分你我他。
  。。。。。。。。
  如果,你真的有那么一些更新不频繁的接口。我建议使用spring的缓存,有clear方法。针对整个方法/事物。
  欢迎对喷 DSC0000.gif

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304929-1-1.html 上篇帖子: Mybatis与Hibernate的区别 下篇帖子: SpringMVC MyBatis 配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表