Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4218404
  • 博文数量: 291
  • 博客积分: 8003
  • 博客等级: 大校
  • 技术积分: 4275
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-30 18:28
文章分类

全部博文(291)

文章存档

2017年(1)

2013年(47)

2012年(115)

2011年(121)

2010年(7)

分类: 系统运维

2012-07-04 22:03:34

最近发现使用了springMVC的新项目偶尔出现connection closed,同事反映当访问同一个controller时经常出现类似错误
上回发现在使用

点击(此处)折叠或打开

  1. <context:component-scan base-package="com.controller" />
对@controller注解扫描生成的controller,若是没有加@Scope("prototype")的话,生成出来的controller就是单例的。见http://blog.chinaunix.net/uid-11121450-id-3258548.html
虽然发现这个问题但是由于connection closed的错误现象很难重现,因此上回放弃了。
今天晚上我在测试中无意中又出现了这样的错误,我对controller加了@Scope("prototype"),还是出现一样的错误。
我用下面的语句打印本类的地址,发现每次打印出来的地址都不一样,证明每次请求都重新创建了controller

点击(此处)折叠或打开

  1. System.out.println("reserve:"+this.getClass().getName()
  2.                 +"@"+Integer.toHexString(this.hashCode()));

这时我注意到service是用@Autowired,于是我把service的地址也打印出来,发现service 的地址,每次访问都是一样的。也就是说虽然controller是多例了,但是里面的service是单例的,因此每次把新建的connection赋予service之后,请求结束就关闭连接这种方式存在问题。
我的每一个service的connection是通过setConn访问给传进去的,其它数据库方法都使用这个service的connection.
在两个请求同时请求到同一个service时,若是先开始创建connection一个service执行比较慢,而另一个后开始的service也申请了新的一个connection,由于service是单例的,就会把第一个connection给覆盖掉了。若是第二个service先完成就关闭连接,那么第一个service就会出现“connection closed”错误,从而出现一个未关闭的connection(第一个service申请的connection)。

解决办法
1.在controller和service上都增加@Scope("prototype"),这样controller和service都是多例。
2.service不采取setconn方法,每个方法都从参数获取connection.

阅读(25200) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~