客戶想實現對會話空閑時間的控制,下面是做的一個例子。
Microsoft Windows [版本 6.1.7601]
版權所有 (c) 2009 Microsoft Corporation。保留所有權利。
C:\Users\LIUBINGLIN>sqlplus sys/Oracle123@localhost:1521/hello as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on 星期二 4月 14 08:42:55 2015
Copyright (c) 1982, 2011, Oracle. All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> create profile test_profile limit idle_time 1; 表示允許的空閑時間為1分鍾。
配置文件已創建
SQL> set linesize 200
SQL> select * from dba_profiles where profile='TEST_PROFILE';
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------------------------ -------------------------------- -------- ----------------------------------------
TEST_PROFILE COMPOSITE_LIMIT KERNEL DEFAULT
TEST_PROFILE SESSIONS_PER_USER KERNEL DEFAULT
TEST_PROFILE CPU_PER_SESSION KERNEL DEFAULT
TEST_PROFILE CPU_PER_CALL KERNEL DEFAULT
TEST_PROFILE LOGICAL_READS_PER_SESSION KERNEL DEFAULT
TEST_PROFILE LOGICAL_READS_PER_CALL KERNEL DEFAULT
TEST_PROFILE IDLE_TIME KERNEL 1
TEST_PROFILE CONNECT_TIME KERNEL DEFAULT
TEST_PROFILE PRIVATE_SGA KERNEL DEFAULT
TEST_PROFILE FAILED_LOGIN_ATTEMPTS PASSWORD DEFAULT
TEST_PROFILE PASSWORD_LIFE_TIME PASSWORD DEFAULT
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------------------------ -------------------------------- -------- ----------------------------------------
TEST_PROFILE PASSWORD_REUSE_TIME PASSWORD DEFAULT
TEST_PROFILE PASSWORD_REUSE_MAX PASSWORD DEFAULT
TEST_PROFILE PASSWORD_VERIFY_FUNCTION PASSWORD DEFAULT
TEST_PROFILE PASSWORD_LOCK_TIME PASSWORD DEFAULT
TEST_PROFILE PASSWORD_GRACE_TIME PASSWORD DEFAULT
已選擇16行。
SQL> show parameter resource
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_limit boolean FALSE
resource_manager_cpu_allocation integer 4
resource_manager_plan string
SQL> alter system set resource_limit =true; 對PROFILE中KERNEL類型的項目進行控制需要將該參數設置為TRUE,PASSWORD類型的項目不受此參數限制。
系統已更改。
SQL> create user test111 identified by test111 default tablespace users temporary tablespace temp profile test_profile;
用戶已創建。
SQL> grant connect,resource to test111;
授權成功。
另外窗口開一個會話:
C:\Users\LIUBINGLIN>sqlplus test111/test111@localhost:1521/hello
SQL*Plus: Release 11.2.0.3.0 Production on 星期二 4月 14 08:55:49 2015
Copyright (c) 1982, 2011, Oracle. All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> create table test (id number);
create table test (id number)
*
第 1 行出現錯誤:
ORA-02396: 超出最大空閑時間, 請重新連接
空閑一分鍾后再操作就會收到上面的報錯。
但是客戶說以上的方法只是適用於SQLPLUS,對PL/SQL工具無效,下面討論一下為什么對PL/SQL無效。
使用test111登陸PL/SQL之后查看數據庫會話信息:
成功登陸后在數據庫里面看到創建了兩個session,可以看到session的login時間是11:17:09和11:17:28兩個時間點。由於沒有執行任何SQL,登陸成功后的session狀態是INACTIVE的。
IDLE_TIME設置的為1分鍾,1分鍾后兩個會話的狀態變成了SNIPED,表示會話已經過期。
當在PL/SQL中執行任何SQL語句的時候,PL/SQL沒有報錯,成功執行。
但是從后台看,登陸時間變成了11:20:47和11:20:51,狀態又變成了INACTIVE。
說明在PL/SQL執行SQL語句的時候自動的重新登陸了。
下面是SQLPLUS的情況:
11:37:26登陸成功后,為SQLPLUS創建了一個SESSION,
1分鍾沒操作后會話變成了SNIPED狀態。
再次到該會話操作時,收到如下報錯:
從上一張圖片可以看出,從后台看SQLPLUS的SESSION已經被KILL。
由此可以判斷,PROFILE IDLE_TIME對SQLPLUS有效,對PL/SQL無效跟客戶端有很大關系。
通過這個實驗還可以發現一點,會話過期后,會話的狀態會變成SNIPED,該會話不會被立即KILL,直到會話對應的客戶端下次執行SQL時被KILL,說明這段時間會話對應的服務器進程一直存在,如果這樣的會話很多,且SNIPED存在的狀態持續較長時間,那么數據庫可能超過PROCESSES初始化參數的限制。
另外這里解釋一下sqlnet.ora配置文件中配置SQLNET.EXPIRE_TIME參數的含義:
SQLNET.EXPIRE_TIME=1表示每過1分鍾都向客戶端發出一個測試連接的包,客戶端收到后會給出響應,如果連接正常,這個連接是不會被殺掉的。
這個參數是用於解決客戶端無故關閉,網絡出現故障,再指定的時間內殺掉服務器進程。
Oracle推薦PROFILE和SQLNET.EXPIRE_TIME一起使用,但由於PL/SQL工具本身的特點,它會在SESSION的狀態變成SNIPED(PROFILE IDLE_TIME超時)后,第一次操作的時候自動重新連接,所以這兩種方法都控制不了它。
Oracle提出一種方法,就是在Oracle服務器端部署定時殺掉SNIPED狀態會話的腳本。但是為了處理少量的PL/SQL客戶端,未免有點大費周章了。
--end--
轉:http://www.linuxidc.com/Linux/2015-05/117055.htm