阿里Druid连接池报java.sql.SQLException: connection holder is null解决过程

沙海 2019年1月28日22:27:17Java Java工具类 Java实战评论1,2421字数 1523阅读5分4秒阅读模式

最近做一个Java后台的小项目,用到了druid数据库连接池,阿里出品,大厂出品。。。但是。。。项目做到一半操作了两张表时出了问题,一直报java.sql.SQLException: connection holder is null 异常。因为能看外面的世界,首先用的是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

下面是我查询时收集的其他人出现的问题:

  1. 我也遇到了,原因是因为写代码时不小心关闭了连接,但后面的代码中仍需要使用该连接,导致出现该问题。 出现该问题的原因应该是:关闭后,连接池管理器(如:druid,dbcp等)会回收该连接,如果不重新申请新的连接,则该连接将不能使用(也就是没有执行者了)。
  2. 我也遇到了这种情况,原来是在将Connection对象关闭的时候,没有将ThreadLocal中的Connection对象移出,导致了后面执行程序一段时间后,conn自动销毁。
  3. 我觉得你可以总结下经验了,我网上查的全都是类似楼主这种回答,结果都是错的,刚才想放弃,刷了下评论,看到你的评论试了下,可以了。就是出现我不小心关闭,导致后面不能用。
文章源自JAVA秀-https://www.javaxiu.com/934.html
继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定