• connection holder is null新增解决方案(2018-06-02)


    最近在做Java后台的项目,用到了druid数据库连接池,阿里出品,肯定是精品的意思咯,这也是我们老大搭建的框架,我就站在前人的肩膀上飞翔了。先前在一个事物里,使用了多条数据库操作,都是正常的,但是前天出了问题,一直报java.sql.SQLException: connection holder is null 异常,很是苦恼。

    因为能呼吸新鲜空气,首先用的是Google,但是这个是阿里出品,国人用的比较多,找到的基本都是咱们程序员弄的答案,大致的解决方案如下:

    1:设置removeAbandonedTimeout超时时间,配置一般都是180,设置成1800,并且将removeAbandoned设置为true

    /*是否自动回收超时连接*/
    
    <property name="removeAbandoned" value="true" />
    
    /*延长这个所谓的超时时间*/
    
    <property name="removeAbandonedTimeout" value="1800" />
    

    2:直接关闭removeAbandoned

    <property name="removeAbandoned" value="false">
    

    看到这两个答案,心里狂喜,原来很多人遇到了一样的问题,那就开干,结果,GG,对我来说作用并不大。我也查阅了我的Git日志,自始至终没有修改过配置,所以配置对我来说肯定是对的,而且先前跑的代码也是正确,就不知道哪儿出问题了。

    但是先前想到,因为在代码review的时候,把数据库连接给关闭了,但是我后面又想要使用这个链接,而我出错的地方就是在我想重新获取连接的时候出错了,贴上我的代码

    conn = DataSourceUtils.getConnection(transactionManager.getDataSource());

    就是这行报了错。在使用之前,我把连接关闭了,用的方法如下

     /**
     * 快捷关闭
     * 
     * @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关闭后还想着去用它。如果你确定后续还需要使用,那么就不要画蛇添足啦

    为什么会找到这里,一方面是因为项目代码都是自己写的,有怀疑的地方大概有个数,还有就是借用了大家问答下面的回答,我就是看了关于druid数据连接池抛出的 connection holder is null 异常这篇文章里“毛衣”哥的回复,我才想到要去用这个方法尝试下,结果果然可以,所以我给他写了个评论,支持他分享,但是又怕他没看见,所以还是立马下定决心,自己写下这个感悟,提供另一个思路给需要的小伙伴。主要是参考了好几个写前面两个方案的博客,后面的评论还是有很多利用了这两个方案没解决的,所以我这里只是提供另外一种思路给各位,希望能打开大家的其他思路。

    本人以前一直是Android开发,写了3年,现在转行写Java后台了,所以难免采坑的地方比较多,后续需要多一些这种风暴,踩完坑,爬出来,然后记录下这深刻的教训。欢迎大家和我一起交流写程序,哈哈

    爱生活,爱学习,爱感悟,爱挨踢

  • 相关阅读:
    SQL学习笔记六之MySQL数据备份和pymysql模块
    SQL学习笔记五之MySQL索引原理与慢查询优化
    SQL学习笔记四之MySQL数据操作
    SQL学习笔记四(补充-2)之MySQL多表查询
    SQL学习笔记四(补充-2-1)之MySQL SQL查询作业答案
    SQL学习笔记四(补充-1)之MySQL单表查询
    SQL学习笔记四(补充-1-1)之MySQL单表查询补充部分:SQL逻辑查询语句执行顺序
    Python Web学习笔记之为什么设计GIL
    SQL学习笔记三之MySQL表操作
    buffer小解
  • 原文地址:https://www.cnblogs.com/dimple91/p/9124653.html
Copyright © 2020-2023  润新知