[20190720]12CR2 max_idle_time.txt

lfree發表於2019-07-20

[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為什麼會加入這樣的引數。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2651226/,如需轉載,請註明出處,否則將追究法律責任。

相關文章