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