一直在使用中的生产上的程序中突然抛出异常“Connection has already been closed.”

1、起因:
最简单的代码,没有框架,因为涉及到事务,做了一个Connection长连接,将此连接向下传递,直到事务结束;否则,回滚。。。事务处理中有一流程:要对文件自身查重,文件本身有5万条数据,耗时3~5分钟左右。文件自身查重结束后,进行数据库查重,,,数据库查重异常报错

public static Connection getConnection() {
    try {
        // DataSource
        Context ctx = new InitialContext();
        ctx = (Context) ctx.lookup("java:comp/env");
        javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("数据源名称"); // JNDI Name
        Connection conn = ds.getConnection();
        if (conn == null) {
            logger.info("数据库连接为空------------");
        } else {
            logger.info("数据库连接不为空-----------");
        }
        return conn;
 
    } catch (Exception ex) {
        logger.info("获取数据源异常。。",ex);
        ex.printStackTrace();
        return null;
    }
}
2、数据库查重异常报错:
catch (SQLException e) {
    logger.error("数据库查重异常!"+e);
    logger.error("数据库查重异常!"+e.getMessage());
    return -2;
}
 
报错日志:
java.sql.SQLException: Connection has already been closed.
3、查找原因:
①数据库

数据库有超时参数设置。当拿到一个连接之后,3~5分钟不与数据库进行操作,会被数据库认为不活动,可能会被释放资源。

超时参数(没了解是什么)设置为时0,该功能被禁用,即永不超时。

②服务器

程序放在了Weblogic服务器上,服务器也有超时参数设置。

非活动连接超时(Inactive Connection Timeout:):设置为时0,该功能被禁用,即永不超时。

通过了解,Weblogic配置两个数据源,其中一个数据源将参数设置为60s。。。在进行一笔测试时,可同时在weblogic后台找到对应时间的pool被释放的日志。

 可见,是服务器认为连接已处于非活动状态,自动释放了数据库连接(同时也解释了数据库查不到连接异常关闭的情况)。

 在修改Inactive Connection Timeout:600(10分钟)后,程序正常支撑。

③程序bug
————————————————
版权声明:本文为CSDN博主「37358143」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37358143/article/details/94597129

发布了3 篇原创文章 · 获赞 0 · 访问量 5296

猜你喜欢

转载自blog.csdn.net/cjlcc/article/details/104067749