博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决莫名其妙出现connection closed的错误
阅读量:6304 次
发布时间:2019-06-22

本文共 1145 字,大约阅读时间需要 3 分钟。

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

上回发现在使用

<context:component-scan base-package="com.controller" />

对@controller注解扫描生成的controller,若是没有加@Scope("prototype")的话,生成出来的controller就是单例的。见

虽然发现这个问题但是由于connection closed的错误现象很难重现,因此上回放弃了。

今天晚上我在测试中无意中又出现了这样的错误,我对controller加了@Scope("prototype"),还是出现一样的错误。

我用下面的语句打印本类的地址,发现每次打印出来的地址都不一样,证明每次请求都重新创建了controller

System.out.println("reserve:"+this.getClass().getName()

+"@"+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.

     本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/1032048,如需转载请自行联系原作者

你可能感兴趣的文章
我们用5分钟写了一个跨多端项目
查看>>
Visual Studio 15.4发布,新增多平台支持
查看>>
有赞透明多级缓存解决方案(TMC)设计思路
查看>>
如何设计高扩展的在线网页制作平台
查看>>
Git 2.5增加了工作树、改进了三角工作流、性能等诸多方面
查看>>
Swift 5将强制执行内存独占访问
查看>>
中台之上(二):为什么业务架构存在20多年,技术人员还觉得它有点虚?
查看>>
深度揭秘腾讯云低功耗广域物联网LPWAN 技术及应用
查看>>
与Jeff Sutherland谈敏捷领导力
查看>>
More than React(四)HTML也可以静态编译?
查看>>
React Native最佳学习模版- F8 App开源了
查看>>
云服务正在吞噬世界!
查看>>
阅读Android源码的一些姿势
查看>>
Web语义化标准解读
查看>>
一份代码构建移动、桌面、Web全平台应用
查看>>
高性能 Lua 技巧(译)
查看>>
区分指针、变量名、指针所指向的内存
查看>>
异步编程的世界
查看>>
最近话题火爆的四件事你知道不?
查看>>
SpringBoot整合MyBatis
查看>>