Oracle数据库会话管理中一个重要的内容是会话超时管理,会话超时管理由涉及到会话创建超时,会话空闲超时、会话故障超时,会话超时的配置也比较复杂,可以在Oracle net services中设置,也可以设置实例级别的超时和用户级别的超时,这篇文章先介绍在Oracle net services中的会话超时设置。
1 Oracle net services简介
Oracle net services是分布式异构环境下的企业级连接方案,可以简化网络配置和管理的复杂性,网络性能最大化,提高网络诊断能力。
Oracle net services由三个主要的组件,Oracle net,Oracle listener和Oracle 连接管理器。
Oracle net 负责建立和维护客户应用程序与数据库服务器之间的连接,在它们之间交换信息。Oracle net 部署于网络中的每一台计算机上。Oracle net在系统中位置和作用可以从下面的官网上图中看到。
Oracle listener,将客户连接请求转交给服务器,在连接建立后,客户端和Oracle 服务器直接通信。其在架构中的位置和功能可以从另一张官网中的图中看到。
监听只在连接建立的过程中起作用,因而在监听的日志中,可以看到大量连接建立的信息,包括连接成功或者是异常的信息,而看不到连接建立后(如连接超时,连接异常)的信息。
Oracle连接管理器不是必备组件,它同客户端或者服务器分开,位于自己的计算机上。为数据库代理或者屏蔽请求。
2 在sqlnet.ora中设置会话超时
2.1 SQLNET.EXPIRE_TIME
这个参数的单位是分钟,指定一个事件间隔。默认值是0,设置为大于0的值之后,Oracle在指定间隔发送一个check消息验证客户端/服务器连接依然活跃。如果探测到一个终结的或者是不再使用的连接,会返回一个错误,导致服务进程退出。主要用于确保客户端异常终结之后,连接不会无限期处于open状态。这个参数主要用于数据库服务器端。这个参数设置为大于0的值后,会额外产生网络业务,尽管非常小,也可能影响网络性能。
2.2 SQLNET.RECV_TIMEOUT和SQLNET.SEND_TIMEOUT
SQLNET.RECV_TIMEOUT这个参数的单位是秒,设置数据库服务器在客户端建立连接之后等待客户端的时间。客户端建立连接后必须在这个指定间隔内发送一些数据,在客户端时常关闭或者异常的环境下,推荐设置这个参数。如果客户端在这个时间间隔内没有发送任何数据,数据库服务器在sqlnet.log中记录一条ORA-12535: TNS:operation timed out
或者 ORA-12609: TNS: Receive timeout occurred消息。没有这个参数,数据库服务器可能会永久等待异常或关闭的客户。这个参数缺省没有设置值。这个参数也可以用户客户端,设置客户端等待服务器发送数据的时间间隔。
SQLNET.SEND_TIMEOUT这个参数的单位也是秒,设置的是数据库在客户端建立连接后完成一个发送操作的时间。也是推荐在客户端时常关闭或者异常的环境下设置,如果没有这个参数,数据库服务器的发送操作可能在客户端关闭或异常时一直等待。也可以用于客户端。
2.3 SQLNET.INBOUND_CONNECT_TIMEOUT和SQLNET.OUTBOUND_CONNECT_TIMEOUT
这两个参数设置连接创建时的超时设置,SQLNET.INBOUND_CONNECT_TIMEOUT单位时秒,设置用户创建连接的超时时间,如果用户不能再设置的时间内创建连接,完成认证,数据库服务器终结连接,并且在sqlnet.log文件中记录客户的 IP地址及一条 ORA-12170错误,客户端会收到一条RA-12547: TNS:lost contact 或者一条 ORA-12637: Packet receive failed错误消息。这个参数的缺省值时60.
SQLNET.OUTBOUND_CONNECT_TIMEOUT的单位也是秒,设置了这个超时时间后,用于客户建立到服务器的连接时,如果在指定的时间内没有建立连接,终止连接试图,客户收到一条ORA-12170: TNS:Connect timeout occurred错误。如果没有这个参数,当数据库服务器所在的主机不可达时,到数据库服务器的客户连接请求可能会被阻塞TCP connect timeout 定义的时间间隔,缺省为60秒。
2.4 TCP.CONNECT_TIMEOUT
这个参数的单位时秒,缺省值是60,设置客户建立至数据库服务器的tcp连接的超时时间。如果在这个指定的时间间隔内没有创建tcp连接,连接企图被终止,客户收到RA-12170: TNS:Connect timeout occurred错误。这个值是
SQLNET.OUTBOUND_CONNECT_TIMEOUT的子集,SQLNET.OUTBOUND_CONNECT_TIMEOUT是指客户端建立到数据库实例连接的时间。
3 listener.ora中的超时设置
INBOUND_CONNECT_TIMEOUT_listener_name参数设置在网络连接建立后,客户完成至监听器连接请求的时间。如果在这个指定时间内服务器没有收到客户的连接请求,终结连接并在监听日志内记录客户端的IP address 和一条ORA-12525:TNS: listener has not received client's request in time allowed 错误。这个参数的缺省值是60秒。
4 默认设置下的连接超时
如果不做任何设置,Oracle中的超时设置应该是这样的,INBOUND_CONNECT_TIMEOUT_listener_name是60秒,SQLNET.INBOUND_CONNECT_TIMEOUT的值是60秒,TCP.CONNECT_TIMEOUT是60秒,其它的都没有值或者为0,也就是不生效。在客户创建到数据库服务器的连接过程中如果超时或者异常会有报错,连接建立后则没有任何超时机制,