一直在使用中的生产上的程序中突然抛出异常“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分钟)后,程序正常支撑。

 

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

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

③程序bug

你可能感兴趣的:(实践的那些事)