程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> MySqlDataReader在Using中使用,mysqldatareader

MySqlDataReader在Using中使用,mysqldatareader

編輯:C#入門知識

MySqlDataReader在Using中使用,mysqldatareader


結論:當DataReader放在Using方法中時,會自動釋放資源,如果中途出現了異常處理,也同樣會釋放掉占用的資源。
測試過程:這裡由於沒有將全部分過程記錄下來,只是對結果大體的說明一下,有興趣的童鞋可以自己測試。
首先正常的處理流程:

1 MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters) 2 while (dr.Read()) 3 { 4 keyWords.Add(dr["KeyWord"].ToString()); 5 } 6 dr.Close() View Code

這樣處理貌似是沒問題,不過在測試中,如果“keyWords.Add(dr["KeyWord"].ToString());”出現了異常,此時,程序會調到異常處理的模塊,這樣,就造成了下邊的close方法不會被執行到,從而造成了數據庫連接數的不斷累加,當達到最大值時,問題就顯露出來了。

下邊第一種處理方式采用異常處理:

1 MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters); 2 try{ 3 while (dr.Read()) 4 { 5 keyWords.Add(dr["KeyWord"].ToString()); 6 } 7 } 8 catch(){ 9 } 10 finnally{ 11 dr.Close(); 12 } View Code

毫無疑問,這個方法很容易想到。

第二種處理方式,這裡打算使用using方法進行處理。但是根據理論知識,認為這個是可以的。但是真實的程序運行環境,確實有時不能以理論知識來指導。現在程序在這,有一個很合適的測試環境,為什麼不自己測試下呢?於是就出現了一下的過程:
我是用的是MySql數據庫,C#編寫的程序。
首先補充一些基礎知識
1、Using定義范圍:即時釋放資源,在范圍結束時釋放資源。當在某個代碼段中使用了類得實例,而希望無論什麼原因,只要離開了這個代碼段就自動調用這個類實例的Dispose方法釋放資源。
到達using語句末尾或者中途引發了異常並且控制離開了語句塊,即觸發實例的Dispose方法釋放資源。
然後查看MySqlDataReader的實現:
public sealed class MySqlDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord{...}
確實繼承了IDisposable方法,理論上應該是正確的。
2、MySql查看連接數:
命令: show processlist; 如果是root帳號,你能看到所有用戶的當前連接。如果是其它普通帳號,只能看到自己占用的連接。
show processlist;只列出前100條,如果想全列出請使用show full processlist; 

有了這兩點理論知識,下邊的測試就容易多了:
1、不使用using也不關閉連接:

1 MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters); 2 while (dr.Read()) 3 { 4 keyWords.Add(dr["KeyWord"].ToString()); 5 } View Code

測試,連接數不斷增多。

2、不使用,采用關閉操作:

1 MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters); 2 while (dr.Read()) 3 { 4 keyWords.Add(dr["KeyWord"].ToString()); 5 } 6 dr.Close() View Code

測試,連接數不變化。

3、不使用Using,采用關閉操作,中間執行過程制作一個異常:

1 MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters); 2 while (dr.Read()) 3 { 4 keyWords.Add(dr["Keyord"].ToString()); 5 } 6 dr.Close() View Code

測試,連接數不斷增多。

4、采用Using,無異常的情況:

1 Using(MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters)) 2 { 3 while (dr.Read()) 4 { 5 keyWords.Add(dr["KeyWord"].ToString()); 6 } 7 } View Code

測試,連接數未增加。

5、采用Using中間制作一個異常:

1 Using(MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters)) 2 { 3 while (dr.Read()) 4 { 5 keyWords.Add(dr["Keyord"].ToString()); 6 } 7 } View Code

測試,連接數未增加。

經過這幾步的測試,就有了最初的結論。

閒話不多說,實踐求真知。

Author:月夜
Time:2015-06-09

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved