因为能看外面的世界,首先用的是Google,结果这个是阿里出品,国人用的多,大致的解决方案如下:文章源自JAVA秀-https://www.javaxiu.com/934.html
1: 设置removeAbandonedTimeout超时时间,配置一般都是180,设置成1800,并且将removeAbandoned设置为true文章源自JAVA秀-https://www.javaxiu.com/934.html
/*是否自动回收超时连接*/ <property name="removeAbandoned" value="true" /> /*延长这个所谓的超时时间*/ <property name="removeAbandonedTimeout" value="1800" />
2: 直接关闭removeAbandoned文章源自JAVA秀-https://www.javaxiu.com/934.html
<property name="removeAbandoned" value="false">
但是。。。这些答案我都尝试了,对我来说作用不大。我也查阅了我的Git日志,自始至终没有修改过配置,所以配置对我来说肯定是对的,而且先前跑的代码也是正确,就不知道哪儿出问题了。但是先前想到,因为在代码review的时候,把数据库连接给关闭了,但是我后面又想要使用这个链接,而我出错的地方就是在我想重新获取连接的时候出错了,贴上我的代码文章源自JAVA秀-https://www.javaxiu.com/934.html
conn = DataSourceUtils.getConnection(transactionManager.getDataSource());
就是这行报了错。在使用之前,我把连接关闭了,用的方法如下文章源自JAVA秀-https://www.javaxiu.com/934.html
/** * 快捷关闭 * @param connection * @paramlogger.error("", e); */ public void shortCutClose(Connection connection, Statement statement, ResultSet rs) { try { if (rs != null && !rs.isClosed()) { rs.close(); } if (statement != null && !statement.isClosed()) { statement.close(); } if (connection != null && !connection.isClosed()) { if (!connection.getAutoCommit()) connection.setAutoCommit(true); connection.close(); } } catch (SQLException e) { logger.error("", e); } }
自此发现问题,我把conn关闭了,我后面想用也难呀。所以诞生了第三种方案,就是不能把conn关闭后还想着去用它。文章源自JAVA秀-https://www.javaxiu.com/934.html
下面是我查询时收集的其他人出现的问题:
- 我也遇到了,原因是因为写代码时不小心关闭了连接,但后面的代码中仍需要使用该连接,导致出现该问题。 出现该问题的原因应该是:关闭后,连接池管理器(如:druid,dbcp等)会回收该连接,如果不重新申请新的连接,则该连接将不能使用(也就是没有执行者了)。
- 我也遇到了这种情况,原来是在将Connection对象关闭的时候,没有将ThreadLocal中的Connection对象移出,导致了后面执行程序一段时间后,conn自动销毁。
- 我觉得你可以总结下经验了,我网上查的全都是类似楼主这种回答,结果都是错的,刚才想放弃,刷了下评论,看到你的评论试了下,可以了。就是出现我不小心关闭,导致后面不能用。
继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html

资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
评论