關於資料庫連線的一些小知識點

2021-09-23 19:04:55 字數 1689 閱讀 3047

由於在資料庫連線部分,新建連線的時候一直報「出錯原因:超時時間已到。超時時間已到,但是尚未從池中獲取連線。出現這種情況可能是因為所有池連線均在使用,並且達到了最大池大小。」於是,我便想檢視一下資料庫的活動連線,看看究竟是哪個程式占用了過多的資料庫連線。

我們可以用sp_who(或sp_who2)來顯示所有活動的連線。

use

master;

goexec

sp_who2;

go

查詢的結果如表1。為了可讀性,表1中的結果有刪減了一些列和一些行。但刪去的內容不影響我們要講的東西。

表1 sp_who2查詢的結果

從表1中,我們可以看到有很多程序狀態(見status列)顯示sleeping,並且當前正在執行的命令型別(見command)顯示awating command。

我們就有疑問,為什麼有這麼多的連線程序。首先,我們要明確乙個概念,sql server 不會建立任何連線池,ado.net會。當我們在c#**中開啟乙個資料庫連線後,如果是首次連線,sqlclient就會開啟乙個sql server的連線。當我們從程式裡面關閉這個連線時,sqlclient並不是真正地關閉了這個資料庫的連線,而是延後一段時間才關閉,預設是60秒。如果你沒有在指定延時內重新連線,sqlclient就真正地關閉這個連線。但如果你重連線了,sqlclient就會重用這個連線。這樣子,我們就可以使用相同的連線屬性。

但是有幾種可能的情況可能導致失敗,也就是連線不能重用(或在指定的時間內沒有關閉)。比如當你使用executereader的時候,沒有成功地取回所有的行和結果集,繼而在連線上沒有將reader關閉,可能導致這個問題。

常用的排查資料庫連線問題的方法是執行sql server profiler(使用預設模板)。如果你看到乙個audit login事件,就說明有乙個新的連線已經被建立。如果你看到event rpc:completed with the text "sp_reset_connection",這說明在連線池中的乙個連線被重用。如果你一直沒有看到任何的sp_reset_connection,那就意味著你遇到問題了。sql server profiler如圖1所示。

圖1 sql server profiler

sp_who和 sp_who2的區別

sp_who是官方支援的,有文件可查。sp_who2不是官方支援的,查不到對應的文件,但它更常被使用。他們返回相同的資訊:提供有關 microsoft sql server 資料庫引擎例項中的當前使用者、會話和程序的資訊。但是sp_who2額外新增了一些sp_who沒有提供的列。並且,sp_who2中的資訊更緊湊,更適合用文本來顯示。kalman 寫道:它增加了額外的spid列來增加結果的可讀性.

sql server profiler使用方法

sql server 2005聯機叢書

sp_who, sp_who2和sp_who3

sleeping/awaiting command question

出處:

關於VUE的一些小知識點

1.頁面載入時需要通過ajax去獲取下拉列表的select 資料時候,1 vue 的data裡面要定義資料 2 在方法裡面寫獲取select的方法 3 在js裡面寫 方法的呼叫 4 在頁面中展示 js varvm newvue methods vm.getoptions html divid aa ...

關於python的一些小知識點

1.python連線資料庫 python連線資料庫時,查詢語句的字段如果是字串,必須帶上雙引號 2.啟動虛擬環境 python m venv 資料夾名稱 建立虛擬環境 cd 檔名稱 scripts 切換到scripts下 activate 進入到虛擬環境 deactivate 退出虛擬環境 3.使用...

一些小的知識點

malloc calloc 等記憶體分配函式所獲得的記憶體塊都來自乙個稱為堆 heap 的儲存池。記憶體洩漏 memory leak 是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。記憶體洩漏缺陷具有隱蔽性 積累性的特...