之前某应用就存在长时间不调用,再次调用时处于hang,等待10分钟返回3113的连接错误。今天正好同事也问了个相同的问题,也是应用长时间不调用就出现这种情况。
以前对于这种问题进行过排查,但一直未解决,针对今天的这个系统的问题,还是按照老方法检查,
1. 检查应用日志,确实长时间等待后报3113的错误。
2. 检查数据库的PROFILE中idle_time参数,此处设置的是DEFAULT的UNLIMITED,说明超时不会是由数据库用户PROFILE配置导致的。
3. 检查网络环境,因为这个应用是从一个网段访问另一个网段的数据库,咨询网络中心后,中间有一个防火墙,确实也有超时的设置,是40分钟,也就是应用连接空闲40分钟后,就会自动kill连接。
问题找到了,为了解决这个问题,其实方法也有很多:
1. 写个脚本定时调这个应用,保证40分钟内有调用,就不会出现超时的问题了。
2. 通过Oracle的一些机制自动探测数据库连接来间接保证40分钟内应用有调用。
这篇文章介绍的DCD就是一种比较不错的方法:http://sundog315.itpub.net/post/308/530331。
另外老熊也有一篇非常好的文章推荐:http://www.laoxiong.net/oracle_and_firewall.html。
都是值得反复玩味体会的。