YCOE

You Can't stOp mE!

导航

DWR死锁问题解决

Posted on 2008-03-27 00:20  YCOE  阅读(1349)  评论(5编辑  收藏  举报
  近期,在一个项目中大量使用DWR,但是,在上线不了多久以后,就频繁出现死机问题。
  经过多番排查(使用YourKit),终于将问题锁定在死锁问题上,并定位在DWR的org.directwebremoting.impl.DefaultScriptSessionManager.invalidate方法上。
  经过Google,找到了官方的Bug跟踪:http://getahead.org/bugs/browse/DWR-60
  根据官方的说法,此Bug将在2.0.rc4 版本里解决
  于是下了一个最近的,2.1版本,但是恶梦继续着...
  死锁问题依然存在,没有一点减缓的意思
  于是尝试采纳Scott Rankin的意见:
修改源码The easist thing I can see to do is to move the for loop at the end of checkTimeouts() inside the synchronized block. That way it'd be guaranteed not to deadlock.

  这一修改,曾经让我安心过三天,但是恶梦,依然继续着...
  问题已经出现近两个月了,一点头绪都没有...
  在即将绝望之际,同事一次乱翻文件夹,突然打开了Tomcat/webapps/.../WEB-INF/lib
  一个dwr.jar包孤零零地呆在那里,顿时,一个感觉从心里飞过。当即把这个dwr.jar删掉

  一周过去了,两周过去了,终于迎来了我期望已久的稳定

  原因:classpath中存在两个dwr.jar包,导致dwr在繁忙的时候会引用另一个,在上下文中存在两个实例对象。
  在DWR中大量使用了同步,死锁就理所当然的啦。