[20190720]12CR2 max_idle_time.txt

[20190720]12CR2 max_idle_time.txt

--//12CR2引入max_idle_time参数,可以简单的控制会话长期不使用自动退出,单位是分钟。
--//简单测试看看。

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0

SCOTT@test01p> show parameter max_idle_time
NAME          TYPE    VALUE
------------- ------- -------
max_idle_time integer 0

--//缺省是0.也就是不会起作用。

SCOTT@test01p> alter session set max_idle_time=1;
alter session set max_idle_time=1
                  *
ERROR at line 1:
ORA-02096: specified initialization parameter is not modifiable with this option
--//session级别修改无效。

SCOTT@test01p> alter system set max_idle_time=1;
System altered.

--//退出继续测试。

2.开始测试:

SCOTT@test01p> select sysdate from dual ;

SYSDATE
-------------------
2019-07-20 19:19:52

SCOTT@test01p> host sleep 61

SCOTT@test01p> select sysdate from dual ;
SYSDATE
-------------------
2019-07-20 19:21:16
--//这样无效!!

SCOTT@test01p> select sysdate from dual ;
SYSDATE
-------------------
2019-07-20 19:15:59

SCOTT@test01p> host sleep 120

SCOTT@test01p> select sysdate from dual ;
select sysdate from dual
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 7020
Session ID: 251 Serial number: 49075

--//换一句话讲这个参数非常像sqlnet.ora中的SQLNET.EXPIRE_TIME参数。
--//参考链接:http://blog.itpub.net/267265/viewspace-2150499/=>[20180124]测试SQLNET.EXPIRE_TIME参数3

--//可以看出规律,测试环境是SQLNET.EXPIRE_TIME=1.
--//也就是在15:30:22 - 15:31:22 (1分钟时间内如果client端发起连接,通俗讲执行sql语句),这个1分钟内不会发出从服务器端发监测包.
--//这样到下1分钟(15:31:22 - 15:32:22),如果client没有发起连接,再发出监测包.这样看到的间隔就是接近2分钟.

--//再通俗讲如果在间隔时间内如果有client端发出数据包,服务端的监测包就不会发,这样看到的情况最大间隔就是
--//2 * SQLNET.EXPIRE_TIME.实际上我以前一直以为最大间隙是仅仅出现在开始第1次实际上可以出现任何时间段.

--//自己总算理解为什么SQLNET.EXPIRE_TIME=N,最大间隔是2 * N 分钟.
--//也就是如果网络在没有任何发包的情况下20分钟断开,你必须设置SQLNET.EXPIRE_TIME<=10的原因.

--//我建立如下脚本(aa1.txt):
select sysdate from dual ;
host sleep &&1
select sysdate from dual ;

SCOTT@test01p> @ aa1.txt 130

SYSDATE
-------------------
2019-07-20 19:56:55


SYSDATE
-------------------
2019-07-20 19:59:05

--//你可以发现作为一组命令执行,执行过程中不会断开。仅仅分开执行时才会有效(注:我测试多次,也出现过sleep 121也没有断开的情况)。

--//视乎是连接程序在检测是否有键盘操作,如果执行sleep时回车,结束sleep后,马上执行语句就可以正常执行)。

--//实际上我自己有点不理解oracle为什么会加入这样的参数。

请使用浏览器的分享功能分享到微信等