在Oracle 8x中實現自動斷開後再連接

2021-01-08 威易網

在實際的資料庫應用中,我們經常遇到這樣一個問題,連接到Oracle資料庫的用戶在作了一次操作後,再也沒有後續操作,但卻長時間沒有和資料庫斷開連接。對於一個小型的應用系統來講,本身的連接數目就有限,這好像沒有什麼嚴重的後果,但如果對於一個大型的資料庫應用。如稅務、工商等,如果資料庫的連接數目很多,對於資料庫伺服器來講,多一個連接就要多消耗一份資源,如果大量用戶連接進入資料庫系統但卻不進行任何的操作,這無形之中就白白造成了伺服器系統資源的浪費,同時造成伺服器負載的提高,對於那些確實在工作的用戶來講,就不能最大限度的利用伺服器的資源,嚴重情況下可能造成系統性能的急劇下降。

針對這種問題,該如何處理呢?對於目前流行的三層結構(Browser/Application/Server)開發來講,這個問題可以通過設置應用伺服器端的連接共享池(shared pool)來避免。但對於傳統的兩層結構(Client/Server)應用,就必須由我們人為幹預來避免這種資源浪費情況。具體可以通過一個後臺任務來監控系統中的所有進程,對於那些空閒超過一定時間的進程採取一定的特殊處理措施,如在客戶端提示用戶連接時間太長,如果沒有後續作業系統將自動殺掉該連接或者直接將該空閒連接殺掉。下面就來具體討論如何在Oracle 8x環境下實現用戶進程的自動監控及其對對超過一定空閒時間連接的處理辦法。

一、識別系統中超過一定空閒時間的連接

要實現後臺任務自動對超過一定時間空閒連接的處理,首先第一步工作就是要從所有與資料庫伺服器的連接中識別出那些連接需要處理,也就是需要獲得與伺服器連接的每個用戶的登陸時間及其最後一次操作後的空閒時間。在Oracle系統中,有一個動態性能視圖v$session,該視圖保存著系統當前連接的各種動態信息。其中,有兩個欄位LOGON_TIME和 LAST_CALL_ET可以得到上面的兩個答案。

l LOGON_TIME是一個日期型(Date)欄位,為用戶登陸時間;

l LAST_CALL_ET是一個數字型(Number)欄位,其含義是用戶最後一條語句執行完畢後的時間,單位為秒。每次用戶執行一個新的語句後,該欄位復位為0,重新開始記數。我們可以通過該欄位來獲得一個連接用戶最後一次操作資料庫後的空閒時間。

下面的SQL查詢語句可以得到與當前資料庫連接的所有用戶的一些基本情況,如用戶名、狀態、連接機器的名稱,作業系統中用戶的名稱,UNIX系統的進程號,在UNIX作業系統級斷開連接的語句,Oracle資料庫系統斷開連接的語句,登陸時間以及最後一次操作到現在的空閒時間等等。

SELECT s.username 用戶名稱, s.status 狀態,s.machine 機器名稱,     osuser 作業系統用戶名稱,spid UNIX進程號, 'kill -9 '||spid UNIX級斷開連接, 'alter system kill session ' ||''''||s.sid||', '||s.serial# || ''';' Oracle級斷開連接, TO_CHAR (logon_time, 'dd/mm/yyyy hh24:mi:ss') 登陸時間, last_call_et 空閒時間秒, TO_CHAR (TRUNC (last_call_et / 3600, 0))||' '||' HRS '|| TO_CHAR ( TRUNC ((last_call_et - TRUNC (last_call_et / 3600, 0) * 3600) / 60, 0) ) ||' MINS' 空閒時間小時分鐘, module 模塊 FROM v$session s, v$process p WHERE TYPE = 'USER' AND p.addr = s.paddr AND status != 'KILLED' -- AND SUBSTR (machine, 1, 19) NOT IN ('機器名') AND last_call_et > 60 * 60 * 1 -- 空閒時間超過1小時的連接 ORDER BY last_call_et desc;

在上面的查詢中,我們可以通過SUBSTR (machine, 1, 19) NOT IN ('機器名')這個條件來屏蔽一些機器,這些機器可能需要運行一些耗費很長時間的SQL語句或其他一些特殊情況的機器。屏蔽這些機器的原因就是在後面的後臺自動識別及處理任務中對這些機器不作處理。

二、識別及斷開空閒用戶的存儲過程

上面的查詢語句可以得到系統中所有的連接用戶的一些基本情況,但是又如何來實現系統自動判斷空閒超過一定時間的連接並將其自動斷開呢?Oracle系統提供了一種稱之為後臺任務(Job)自動處理的機制。我們可以編寫一個後臺任務來定時執行,從而判斷是否存在這樣的用戶連接,如果存在,則通過後臺任務將其自動斷開。

首先創建一個存儲過程來完成空閒一定時間用戶的識別和斷開工作,然後添加一個後臺任務來定時(根據空閒時間長短來確定)執行該過程,即可實現自動斷開系統中空閒超過一定時間用戶的需求。

存儲過程p_monitor見下,其中參數an_nimutes為用戶輸入參數,用來確定識別和斷開多長空閒時間連接的用戶,單位為分鐘,默認為60分鐘,也就是1小時。需要注意一點的是,該存儲過程,需要以sys用戶身份運行。相應,調用該存儲過程的後臺任務也需要以SYS身份來添加。

CREATE OR REPLACE PROCEDURE P_MONITOR( AN_MINUTES NUMBER DEFAULT 60) /**//******************************************* 存儲過程用途:識別出系統中超過一定空閒連接時間(   AS_MINUTES)的用戶,並將其kill掉參數:   AN_MINUTES 空閒時間數,單位為分鐘,默認為60分鐘 ********************************************/ AS  v_Str VARCHAR2(100);  CURSOR C_users(v_minutes number) IS  SELECT s.username,  s.status, s.machine, 'alter system kill session '  ||''''||s.sid||','||s.serial# ||'''' operates  FROM v$session s, v$process p  WHERE TYPE = 'USER'  AND p.addr = s.paddr  AND status != 'KILLED'  -- AND SUBSTR (machine, 1, 19) NOT IN ('需要屏蔽不被處理的機器名')  AND last_call_et > v_minutes*60  ORDER BY last_call_et desc; BEGIN FOR T_users IN C_users(an_minutes) LOOP v_Str := T_USERS.OPERATES; EXECUTE IMMEDIATE v_str; END LOOP; END; /

三、後臺任務的定時執行

最後,我們為系統添加一個定時任務,定時調用上面創建的存儲過程,即可完成系統自動識別和處理空閒用戶的工作。

下面是一個實際調用的例子,在sys用戶下,首先添加一個任務,該任務每隔半小時運行一次,每次均調用P_monitor存儲過程,找出系統中空閒時間超過1小時的連接,然後自動斷開。

DECLARE jobno number; BEGIN DBMS_JOB.SUBMIT( job => jobno, what => 'p_monitor(60);', next_date => SYSDATE, interval => '/*1:Hr*/ sysdate + 30/1440); -- 每半小時運行一次 END; /

相關焦點

  • 零基礎學Oracle之4:理解oracle的啟動與關閉
    1、 當輸入startup命令後,Oracle啟動資料庫的參數選擇順序:不建立新連接,還有連接在的話不能關閉。shutdown immediate:不建立新連接;中斷正在執行的sql語句;回滾未提交的事務;斷開在線用戶;將redo buffers裡的內容寫入磁碟;關閉instance。
  • 零基礎學Oracle之2:開始使用oracle
    而oracle則力推java,把java虛擬機內嵌到oracle中。[oracle@wl database]$ ./runInstaller 在資料庫軟體目錄下執行這個安裝,類似於windows的setup
  • Oracle資料庫參數優化參考
    二、pga_aggregate_target:Oracle9i中,PGA_AGGREGATE_TARGET參數僅對專用伺服器模式下(Dedicated Server)的專屬連接有效,對共享伺服器(Shared Server)連接無效;10g後對專用伺服器和共享伺服器都起作用,設置pga_aggregate_target,需要考慮最大並發連接後所需要的pga內存。
  • 如何在Oracle中使用遊標來實現多重循環
    【IT168 伺服器學院】這篇文章,是最近在寫一個項目中所用的存儲過程,由於是第一次接觸oracle,其間花費了許多功夫,才把功能實現!特記錄下來,以供參考!
  • 零基礎學Oracle之6:Oracle數字字典和動態視圖的理解
    2、數字字典(DD)1)在執行數據定義語言(definition language,DDL)語句或有些數據操縱語言 (data manipulation language ,DML) 語句時會更新數據字典2)有幾個特點存儲在system表空間它是由sys擁有由oracle server自動維護。
  • 江湖路遠,有緣再見,RNG、Uzi斷開連接,再見,LPL 006
    Uzi在RNG斷開連接!再見了,LPL006.其實從去年S賽結束,我們都對這位選手保持著希望,真愛粉希望再戰一年,黑粉雖然玩梗,想必也很之前7醬一樣,黑出了感情。而如今,RNG、Uzi斷開連接,RNG在轉會期引入了新人上單705,又是需要很長的磨合期,估計這次夏季賽RNG又走遠了!在RNG大名單公布之後,眾多粉絲也是各種猜測,聯想到阿水和聖槍哥近期的合同問題,再加上之前莽夫打野Mlxg和眾生平等上單Letme的退役,都認為Uzi也是合同原因,一直不能上場。
  • 買了惠普3638 如何實現手機無線連接?
    買了惠普3638 如何實現手機無線連接?"USB線"斷開了。選擇「是」    會自動搜索出周圍的無線網絡,選擇你電腦(臺式或者筆記本)所連接的無線網絡,點擊下一步,輸入密碼進行連接。一般家庭中只有一個無線網絡(WIFI),保證電腦與印表機連接統一網絡即可。
  • 交流接觸器通電後按下啟動按鈕接觸器不斷的吸合、斷開是什麼原因?
    遇到此問題時,應斷開斷路器QF2,按圖紙正確連錢。這裡告訴讀者一個小經驗,只要記住按鈕中接至配電盤端子的5號上的三根導線中的一根起動線即可,另外兩根導線可任意連接。此故障可能原因為:啟動按鈕SB2短路,可更換SB2按鈕;接線錯誤,電源線1號或自鎖線3號錯接到端子5號上了,可按電路圖正確連接;KM交流接觸器主觸點熔焊,需更換交流接觸器主觸點,交流接觸器KM鐵心極面有油汙、鐵鏽,使交流接觸器延時釋放(延時時間不一),拆開交流接觸器將鐵心極面處理乾淨即可;混線或碰線,將混線處或碰線處找到後並處理好。
  • 中性線斷開對用電器有什麼影響?
    我們都知道中性線在星形連接中是很重要的,而我們所使用的配電變壓器主要以星形連接,所以中性線在供電系統中也是非常重要的,接下來我們就分別分析中性線斷開後在不同類型的供電系統中的影響。什麼是中性線在電源的星形連接中我們一般將從繞組的首段引出的導線稱為相線,將三個相線的連接點也就是中性點引出的導線稱為中性線。因為我們的供電標準是頻率為50HZ的正弦交流電,所以在正常情況下星形連接的三個相線的電壓大小相等,相位角相互滯後120度。
  • 自動上水電熱水壺顯示E1故障代碼
    一臺微電腦自動上水電熱水壺,加電後顯示E1 ,不上水,不加熱,各功能按鍵完全失效。原理:這類電熱水壺由底座和壺體兩部分組成。控制電路安裝在底座中,加熱管及限溫,超溫保護電路在壺體底部,兩部分電路通過數量不等的連接觸點進行連接,通過壺體的插入和拔出來控制電路的通電和斷電。
  • Oracle 19C rac集群靜默安裝操作手冊v2.0 for centos7
    /tmp目錄大小至少:1GB2.安裝Grid Infrastracture所需空間:12GB3.安裝Oracle Database所需空間:7.3GB4.此外安裝過程中分析、收集、跟蹤文件所需空間:10GB5.建議總共至少100GB(此處不包含ASM或NFS的空間需求) 1.2.2.內存檢查1.內存大小:至少8GB2
  • 熊貓直播主站流浪計劃第二階段開啟 工程師完全斷開母星連接
    工程師在首頁的代碼裡公布了第二階段的任務,和第一階段在微博上公布方式不同,一般人是不看代碼的,看來負責斷開連接的這位工程師比較有趣。<!--[前言]現公布關於流浪計劃的最新指示如下:熊貓直播主站流浪計劃,第二階段開啟。工程師請完全斷開母星連接。平臺已經進入逃逸軌道,所有人員請進入休眠倉。
  • 電動機自動手動控制電路工作原理,星三角替代新技術電機軟啟動器
    電動機△-Y啟動自動控制電路啟動時,按下啟動按鈕SB2 後再鬆開,失電延時時間繼電 器KT線圈得電吸合後又斷電釋放,KT開始延時。此時KT不延時瞬 動常開觸點立即閉合後又斷開,KT失電延時閉合的常閉觸點立即斷開,KT失電延時斷開的常開觸點立即閉合, 交流接觸器KM1線圈得電吸合且KM1輔助常開觸點閉合自鎖, KM1三相主觸點閉合,將三相交流380V電源接入電動機繞組。同時交 流接觸器KM2線圈也得電吸合,KM2三相主觸點閉合,繞組接成△形, 電動機得電以△形連接開始啟動。
  • G2官宣:樂觀家族族長Perkz斷開連接!你依舊是我們的光
    至此,G2樂觀家族族長Perkz正式斷開連接。從視頻中可以看出,Perkz雖然總是以「騷話」而成為焦點,但他的確是一位非常具有天賦以及隊友們所值得信賴的頂尖選手。與此同時,G2官方也表示,「時至今日,你依舊是我們的光!」而除了G2之外,LEC的官推也是曬出了Perkz在LEC職業生涯時期的照片,並還稱之為「LEC的王。」並且,相信不少人也是能夠從LEC的官推中猜測出,Perkz不僅是離開了G2,更是有可能離開LEC。
  • 在榮耀8x中怎麼設置訪客模式?訪客模式設置方法一覽
    在榮耀8x中怎麼設置訪客模式,很多朋友在使用中都存在這個疑惑,那就來看看小編為大家分享訪客模式設置方法一覽,感興趣的朋友可以了解一下哦~ 首先在榮耀8x的手機桌面上找到並點擊打開【設置】,
  • 某型火炮平衡機氣壓自動調整系統設計與實現
    摘要:本文根據部隊對裝備進行維護和保養的具體需求,研製了火炮平衡機氣壓自動調整系統。能夠實現平衡機氣壓調整的自動操作,平衡機氣壓越限報警,以及任意射角情況下進行平衡機自動充、放氣操作等功能。基於PLC的計算機控制、通訊技術,傳感器技術,氣壓傳動技術;軟體採用了基於神經網絡建模,模糊組合邏輯控制,數位訊號處理等先進技術。
  • 電動機自動快速再啟動線路應用案例,交流接觸器工作原理圖文並茂
    在有些生產設備工作不能停的使用場合,當供電線路斷電後又重新來電的情況下,電動機在短暫停電又恢復供電時需要快速自動啟動電動機。例如在重要的需要連續作業時使用備用電源,這時要求電動機能立即再啟動。下面介紹一個電動機自動快速再啟動應用案例一:電動機自動快速再啟動電氣控制電動機自動快速再啟動電氣圖
  • 空壓機自動排水器怎麼安裝?
    空壓機自動排水器安裝步驟:1、首先要排乾排汙容器和把冷凝液輸送到處理器的管路,這樣可以清除過多的鐵鏽、水垢及灰塵等,以免安裝時下落影響施工質量。2、安裝時需電源必須為斷開狀態且自動排水器保持零壓力狀態下。
  • iPhone重度用戶小技巧:自動開啟低電量模式
    相較於安卓的動輒4000mAh、5000mAh的電池電量,iPhone用戶在重度使用情況下,電池是有些吃力的,所以很多蘋果用戶習慣開啟iPhone的「低電量模式」也就是省電模式,但是當iPhone連接充電充滿到80%的電量後會自動關閉低電量模式,一點都不人性化,那麼該如果設置讓低電量模式一直持續下去呢
  • 無線路由器連接電信光貓實現撥號上網方法
    怎麼讓無線路由器連接光貓並實現自動撥號上網功能呢?雖然大部分電信光貓本身自帶撥號及無線功能,但無線路由器相比而言,更易於對無線網絡及上網方式進行控制,同時還可以有效的擴展無線網絡。因此有時更有必要讓無線路由器連接光貓並實現撥號上網功能。下面就是具體的實現方法。