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

尛樣兒發表於2015-05-04

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

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表示允許的空閒時間為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;    <<<< PROFILEKERNEL型別的專案進行控制需要將該引數設定為TRUEPASSWORD型別的專案不受此引數限制。

 

系統已更改。

 

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,可以看到sessionlogin時間是11:17:0911:17:28兩個時間點。由於沒有執行任何SQL,登陸成功後的session狀態是INACTIVE的。

IDLE_TIME設定的為1分鐘,1分鐘後兩個會話的狀態變成了SNIPED,表示會話已經過期。

當在PL/SQL中執行任何SQL語句的時候,PL/SQL沒有報錯,成功執行。

但是從後臺看,登陸時間變成了11:20:4711: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推薦PROFILESQLNET.EXPIRE_TIME一起使用,但由於PL/SQL工具本身的特點,它會在SESSION的狀態變成SNIPED(PROFILE IDLE_TIME超時)後,第一次操作的時候自動重新連線,所以這兩種方法都控制不了它。


    Oracle提出一種方法,就是在Oracle伺服器端部署定時殺掉SNIPED狀態會話的指令碼。但是為了處理少量的PL/SQL客戶端,未免有點大費周章了。


--end--

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

相關文章