今天有客户反馈应用测试连接Oracle数据库的会话半小时左右未做操作就会被中断,报错ORA-3113,询问数据库是否有这样的超时设置,能否取消掉这个限制?
登上环境查看监听日志发现连接的IP和数据库IP不是同一网段,故询问中间是否有防火墙设备,得到肯定的答复后,再结合实际的现象,基本也就确认是由于防火墙默认强制断开一段时间内(这里也就是半小时)都是空闲状态的会话,然后会话再做操作时就会发现原连接已经被断开,报错ORA-3113,然后只能重连。
防火墙涉及其他部门管理,协调比较麻烦。还好Oracle有DCD(Dead Connection Detection)这个功能特性,主要就是设置一个时间比如10分钟,那么每隔10分钟Oracle就会发一个空包给连接会话的客户端,防火墙发现会话变为活跃就会重新计时,这样也可以间接解决这个问题。

配置DCD的方法非常简单,就是在监听对应的sqlnet.ora 配置文件中添加1行内容:

sqlnet.expire_time = 10

含义可以从sample示例中找到说明:

########################
#sqlnet.expire_time = 10
########################
#
#Possible values: 0-any valid positive integer! (in minutes)
#Default: 0 minutes
#Recommended value: 10 minutes
#
#Purpose: Indicates the time interval to send a probe to verify the
#         client session is alive (this is used to reclaim watseful
#         resources on a dead client)
#
#Supported since: v2.1

设置完成后要重启监听,或者reload监听生效。

lsnrctl reload

但这只对新的连接有效,对于已经存在的连接是没作用的,针对这些连接必须要杀掉重连才可以,或者干脆等到他们碰到ORA-3113,再进行重连。

在客户反馈的数据库均配置好DCD,reload监听,通知客户测试,告知新的连接才有效。
最终经过客户一下午的观察,确认之前反馈的问题已经得到解决。