1. 程式人生 > >ADO.net應該手動釋放資源。

ADO.net應該手動釋放資源。

本來對於C#的GC有諸多爭議,像我這樣從偽C++程式設計師轉過來的,自然對於靠第三方回收堆上物件的行為,感到一種恐懼和無力。但是,既然Java和C#都有GC,總還認為是可靠的,但是,誰知道這個可靠的GC缺出問題了。

案例:同事做的一個操作資料庫的B/S小程式出問題了,前臺asp.net,資料庫SQL2k,操作資料庫用了ADO.net,操作幾次之後,頁面報錯,Debug時發現asp.net報錯的大意為在connection時連線池超過了等待時間。

我們首先懷疑資料庫連線太多,但是查詢分析器直接連線資料庫正常。

其次,懷疑asp.net的連線池出錯,在連線字串加了min和max之後,發現問題仍然存在。

再次,查原始碼,同事說這是網上共享的原始碼,邏輯很簡單,看了之後,第一反應就是隻有connection.Open,沒有Close();轉念一想,C#不是有GC麼,另外在部落格園的部落格中也有人提到使用using強制是否資源,對Linq to SQL,有時候會產生意想不到的問題,不建議。作為C#二把刀的我,類比到ADO.net 想來也應該是讓GC來回收資源比較好。

結果查了半天,沒有發現問題所在,只能再次加大了連線池的max,問題仍然會出現。

之後,翻閱了網上關於連線池的資料,提到

1、GC的回收是針對惡劣環境才進行的。

2、GC只回收託管資源,不回收非託管資源

3、對於連線池,在Connection.Open的時候,ado.net直接問連線池要現有連線,如果沒有空閒的 ,則等待,超過等待時間,則返回time expired。

GC沒有按照作用域回收資源->Connection沒有關閉->連線池連線全部處於使用->新增Connection.Open請求失敗,於是time expired

因此,正好手頭有個專案是用ADO.net,從此發現GC也不可靠,還是手動來吧。

特此記錄,可以自動釋放資源的操作

1、

SqlDataReader dr= myCommand.ExecuteReader(CommandBehavior.CloseConnection)

關聯的conn需要手動開啟,但是SqlDataReader讀完後自動關閉。

2、

SqlDataAdapter

對於關聯的conn,在SqlDataAdapter.Fill()時會自動開啟,完畢後會自動關閉。

一般程式對於SqlDataAdapter建議手動Dispose()原因不明。

3、

SqlConnection

用完一定要Close()或者Dispose(),差別是Close的可以Open,Dispose的不能了,因為ConnectionString=String.Empty了,見傳送門

相關推薦

ADO.net應該手動釋放資源

本來對於C#的GC有諸多爭議,像我這樣從偽C++程式設計師轉過來的,自然對於靠第三方回收堆上物件的行為,感到一種恐懼和無力。但是,既然Java和C#都有GC,總還認為是可靠的,但是,誰知道這個可靠的GC缺出問題了。 案例:同事做的一個操作資料庫的B/S小程式出問題了,前臺a

【java】手動釋放資源問題

前言: java語言中由於有垃圾回收機制,因此大大解放了程式設計師的工作量,不再需要擔心自己忘記釋放不用的記憶體而導致記憶體洩露這樣尷尬的事情了,當我們高呼gc萬歲的時候,還是會發現在很多場景需要我們做一些手動close,或recycler。下面就這個

ADO.Net之SqlConnection、 Sqlcommand的應用

all 密碼 on() .sh dem sel .exe sele scalar ADO.Net之SqlConnection、 Sqlcommand的應用。 知識點: 1.為了能夠使用SQLConnection類,我們首先需要引用命名空間System.Data.SqlCl

C#或 VB.NET通過 ServiceController 程式碼控制Windows服務安裝解除安裝過程出錯,對windows服務程式檔案佔用,無法釋放資源問題

一、VS報的錯誤 二、程式碼 三、錯誤分析 1.首先,這個錯誤是因為檔案許可權問題引起的,筆者系統為WIN10,VS2017。筆者在給要控制安裝啟動的windows服務程式資料夾新增上“Everyone”許可權後,是可以正常通過程式碼正常控制windows服務的安裝、

無法為具有固定名稱“System.Data.SqlClient”的 ADO.NET 提供程式載入在應用程式配置檔案中註冊的實體框架提供程式型別“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”

Windows服務中程式釋出之後會如下錯誤: 無法為具有固定名稱“System.Data.SqlClient”的 ADO.NET 提供程式載入在應用程式配置檔案中註冊的實體框架提供程式型別“System.Data.Entity.SqlServer.SqlProviderServices, EntityFra

jni未釋放資源問題Failed adding to JNI local ref table (has 512 entries)

基於 Android NDK 的學習之旅-----資源釋放         做上一個專案的時候因為與C引擎互動頻繁,有時候會突然莫名其妙的的整個應用程式直接掛掉。因為我是學Java 開始的,所以對主動釋放記憶體沒多大概念(GC直接幫忙回收),後查詢原因才知道是因為JNI

[BUG]ASP.NET 未被授權訪問所請求的資源請考慮授予 ASP.NET 請求標識訪問此資源的許可權

“/”應用程式中的伺服器錯誤。-------------------------------------------------------------------------------- 對路徑“//10.6.27.8/rec/rec/20100719/170007.vo

ADO.NET】8、DataSet的使用

pub () 服務器 定義 讀取 rem 錯誤 無法 man 一、DataSet的查詢 SqlDataReader 適用於大型數據的讀取,它是一條一條的讀取,讀取出來的數據是存放在服務器上當正在讀取數據的時候,突然與服務中斷,將無法讀取後面的數據DataSet 適用於小型數

ADO.NET】7、SQL高級封裝

cal reat title urn clear itl [] esc 存儲 public static string str = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;

ADO.NET】1、簡單配置與使用

字符串 文件中 .exe 增加 獲取字符串 pass 數據庫連接 rect manage 1、一些基礎的知識點 ExecuteReader(); //返回查詢到的數據,一次一行,用於 selectExecuteNonQuery(); //返回影響的行數,用於 delete,

ADO.NET】3、從TXT中導入數據到數據庫

split src 分割 img oid data 返回 ring sage private void btnInput_Click(object sender, EventArgs e) { if (opFile.ShowDialog() != DialogR

.NET學習筆記之ADO.NET

技術分享 reader sql語句 bsp 技術 area ada 執行sql 學習 據提供程序: Connection,用來連接數據庫 Command,用來執行SQL語句 DataReader只讀,只進的結果集,一條一條讀取數據 DataAdapter,一個封裝了上面3個

,NET學習筆記之ADO.NET

nbsp png alt 學習 log logs ima http blog ,NET學習筆記之ADO.NET

Java進擊C#——語法之ADO.NET

parameter stmt 深入 真的 讀者 方式 對他 新建 文本 本章簡言 上一章講到關於C#語法的基礎部分。了解相關的基礎部分之後我們就要去了解一下C#是什麽樣子訪問數庫的。C#把訪問數據庫這一部分的知識點叫作ADO.NET。即是JAVA常常講到的JDB

C#回顧 Ado.Net C#連接數據庫進行增、刪、改、查

app linq while 一行 awk col 所有 console value 一、簡介 1、ado.net是一門數據庫訪問技術。 他可以通過程序來操作數據庫 2、類庫 Connection 類 和數據庫交互,必須連接它。連接幫助指明數據庫服務器、數據庫名字、用戶名、

ADO.NET基礎知識】SqlConnection、command、DataSet 、DataTable、dataAdapter

mysq change ado.net 使用 屬於 再次 結構 mman 索引 1.使用Connection連接數據庫的步驟:   (1).添加命名空間 System.Data.SqlClient(註意:初學者經常會忘記)   (2)定義連接字符串。連接SQL Server

【】ADO.NET基礎-Session】Session的基本應用

ear 重定向 session 存儲 null tran 過去 方式 string 在服務端存儲狀態的對象:Session和Application 在客戶端存儲狀態的對象:Cookie 1.Session:每個獨立的瀏覽器都會創建一個獨立的Session,不是一臺電腦一個S

ADO.NET註入攻擊和防禦

pda date upd user int execute 編號 數據 .net 當在添加程序中註入攻擊時在控制臺應用程序中可以這樣寫: 請輸入編號:U006 請輸入用戶名:無敵 請輸入密碼:1234 請輸入昵稱:呵呵 請輸入性別:True 請輸入生日:2000-1-1 請

C#後臺獲取數據庫數據--ADO.NET

字符 連接 四個步驟 close info 關閉數據庫 設置 數據 init 關於獲取數據庫中的數據到後臺,可分為4個步驟:1.獲取連接數據庫的字符串;2.創建SqlConnection對象用於打開數據庫;3.創建SqlCommand對象用於執行操作,設置它的一系列屬性即可

ADO.NET五大對象詳解

支持 數據庫 asp 增刪改 eno 打開 sql man let Connection 連接對象Command 命令對象,指示要執行的命令和存儲過程! DataReader是一個向前的只讀的數據流。 DataAdapter是功能強大的適配合器,支持增刪改查的功能 Data