使用Oracle PROFILE控制會話空閑時間


客戶想實現對會話空閑時間的控制,下面是做的一個例子。
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM