天天看點

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

客戶想實作對會話空閑時間的控制,下面是做的一個例子。

Microsoft Windows [版本 6.1.7601] 

版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 

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 

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 

SQL> create table test (id number); 

create table test (id number) 

第 1 行出現錯誤: 

ORA-02396: 超出最大空閑時間, 請重新連接配接 

空閑一分鐘後再操作就會收到上面的報錯。 

但是客戶說以上的方法隻是适用于SQLPLUS,對PL/SQL工具無效,下面讨論一下為什麼對PL/SQL無效。

使用test111登陸PL/SQL之後檢視資料庫會話資訊:

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

成功登陸後在資料庫裡面看到建立了兩個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的情況:

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

11:37:26登陸成功後,為SQLPLUS建立了一個SESSION,

1分鐘沒操作後會話變成了SNIPED狀态。

再次到該會話操作時,收到如下報錯:

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

從上一張圖檔可以看出,從背景看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

本文轉自 張沖andy 部落格園部落格,原文連結:http://www.cnblogs.com/andy6/p/5756012.html   ,如需轉載請自行聯系原作者