1、问题描述
附件同步会发送文件消息给消息中间件,然后会删除数据库中对应附件记录,不断的重复这样的过程,但是最近的附件同步好像进入了死循环,消息中间件里的附件数量一直在增加,可以看到下面的阻塞的附加数量已经到1万了,平时一天只有几百的附件,怎么会有这么大的附件数量呢
2、分析
boolean successFlag = SyncManagerService.getInstance().sendMessageToMQ(message);
Log.info("[LiEMS数据同步引擎日志--附件] 发送消息队列结束 结果successFlg为" + successFlag);
if (successFlag)
{
Log.info("[LiEMS数据同步引擎日志--附件] 删除生产库的dkdocmst_temp表记录开始");
deleteTempData(db, detailDataObj);
Log.info("[LiEMS数据同步引擎日志--附件] 删除生产库的dkdocmst_temp表记录结束");
}
先把文件发送到消息中间件,然后删除数据库对应的记录,下次同步的就是以后的附件,这里怎么会重复发送呢,再者我们上面这段代码是放在同步块里的啊
synchronized (SyncBizFileDataToMQService.class)
{
}
初步怀疑就是数据库没有删除成功,这时就要找证据了,打开日志发现如下内容
[ERROR][2019-07-04 17:51:53][SYSTEM]net.luculent.core.database.DBException: Connection has already been closed. with sql is delete from DKDOCMST_TEMP where DOC_ID = '1146689096949694464' and TEMP_PKVAL = '1198020'
3、原因
从上面来看数据库连接被自动释放了,有个直觉就是发送附件时间太长,不活动连接多长时间就自动释放,但是发送大附件的又不是头一次,肯定是现场改了配置,于是联系现场人,现场人说优化过weblogic的参数,各种截图给我确认,可是看着都不像,最后想到weblogic的数据库连接参数都是在配置文件中的,于是打开配置文件惊奇的发现了一个配置项Inactive Connection Time-Out,配置了60,立刻让现场人去掉这个配置,现场人也和我解释是根据优化手册配置的,总结一下吧,毕竟花了很长时间排查这个问题,最后附上这个参数的含义:https://blogs.oracle.com/saas-fusion-app-performance/inactive-connection-time-out