DataReader不能使用using的詳細(xì)示例
本文介紹了DataReader不能使用using的詳細(xì)示例,分享給大家,具有如下:
public static MySqlDataReader ExecuteMySqlReader(string sqlStr)
{
MySqlConnection conn = new MySqlConnection(MyConString);
MySqlCommand cmd = new MySqlCommand(sqlStr, conn);
try
{
conn.Open();
//執(zhí)行CloseConnection命令時,如果關(guān)閉關(guān)聯(lián)的DataReader對象,則關(guān)聯(lián)的Connection對象也將關(guān)閉
//用using(conn)會報錯,因為執(zhí)行完命令就會關(guān)閉連接,其它代碼調(diào)用DataReader對象時,連接已經(jīng)關(guān)閉。
MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
catch (Exception exp)
{
throw new Exception(exp.Message);
}
}
PS:MySqlDataReader在Using中使用
結(jié)論:當(dāng)DataReader放在Using方法中時,會自動釋放資源,如果中途出現(xiàn)了異常處理,也同樣會釋放掉占用的資源。
測試過程:這里由于沒有將全部分過程記錄下來,只是對結(jié)果大體的說明一下,有興趣的童鞋可以自己測試。
首先正常的處理流程:
MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters)
while (dr.Read())
{
keyWords.Add(dr["KeyWord"].ToString());
}
dr.Close()
這樣處理貌似是沒問題,不過在測試中,如果“keyWords.Add(dr["KeyWord"].ToString());”出現(xiàn)了異常,此時,程序會調(diào)到異常處理的模塊,這樣,就造成了下邊的close方法不會被執(zhí)行到,從而造成了數(shù)據(jù)庫連接數(shù)的不斷累加,當(dāng)達(dá)到最大值時,問題就顯露出來了。
下邊第一種處理方式采用異常處理:
MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
try{
while (dr.Read())
{
keyWords.Add(dr["KeyWord"].ToString());
}
}
catch(){
}
finnally{
dr.Close();
}
毫無疑問,這個方法很容易想到。
第二種處理方式,這里打算使用using方法進(jìn)行處理。但是根據(jù)理論知識,認(rèn)為這個是可以的。但是真實的程序運行環(huán)境,確實有時不能以理論知識來指導(dǎo)?,F(xiàn)在程序在這,有一個很合適的測試環(huán)境,為什么不自己測試下呢?于是就出現(xiàn)了一下的過程:
我是用的是MySql數(shù)據(jù)庫,C#編寫的程序。
首先補(bǔ)充一些基礎(chǔ)知識:
1、Using定義范圍:即時釋放資源,在范圍結(jié)束時釋放資源。當(dāng)在某個代碼段中使用了類得實例,而希望無論什么原因,只要離開了這個代碼段就自動調(diào)用這個類實例的Dispose方法釋放資源。
到達(dá)using語句末尾或者中途引發(fā)了異常并且控制離開了語句塊,即觸發(fā)實例的Dispose方法釋放資源。
然后查看MySqlDataReader的實現(xiàn):
public sealed class MySqlDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord{...}
確實繼承了IDisposable方法,理論上應(yīng)該是正確的。
2、MySql查看連接數(shù):
命令: show processlist; 如果是root帳號,你能看到所有用戶的當(dāng)前連接。如果是其它普通帳號,只能看到自己占用的連接。
show processlist;只列出前100條,如果想全列出請使用show full processlist;
有了這兩點理論知識,下邊的測試就容易多了:
1、不使用using也不關(guān)閉連接:
MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
while (dr.Read())
{
keyWords.Add(dr["KeyWord"].ToString());
}
測試,連接數(shù)不斷增多。
2、不使用,采用關(guān)閉操作:
MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
while (dr.Read())
{
keyWords.Add(dr["KeyWord"].ToString());
}
dr.Close()
測試,連接數(shù)不變化。
3、不使用Using,采用關(guān)閉操作,中間執(zhí)行過程制作一個異常:
MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
while (dr.Read())
{
keyWords.Add(dr["Keyord"].ToString());
}
dr.Close()
測試,連接數(shù)不斷增多。
4、采用Using,無異常的情況:
Using(MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters))
{
while (dr.Read())
{
keyWords.Add(dr["KeyWord"].ToString());
}
}
測試,連接數(shù)未增加。
5、采用Using中間制作一個異常:
Using(MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters))
{
while (dr.Read())
{
keyWords.Add(dr["Keyord"].ToString());
}
}
測試,連接數(shù)未增加。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
wireshark抓取本地回環(huán)數(shù)據(jù)包和取出數(shù)據(jù)的方法
這篇文章主要介紹了wireshark抓取本地回環(huán)數(shù)據(jù)包和取出數(shù)據(jù)的方法,需要的朋友可以參考下2014-02-02
ASP.NET Core設(shè)置URLs的方法匯總(完美解決.NET 6項目局域網(wǎng)IP地址遠(yuǎn)程無法訪問的
近期在dotnet項目中遇到這樣的問題.net6 運行以后無法通過局域網(wǎng)IP地址遠(yuǎn)程訪問,整理出解決問題的五種方式方法,感興趣的朋友一起看看吧2023-11-11
.net 中的SqlConnection連接池機(jī)制詳解
.net 中通過 SqlConnection 連接 sql server,我們會發(fā)現(xiàn)第一次連接時總是很耗時,但后面連接就很快,這個其實和SqlConnection 的連接池機(jī)制有關(guān)2013-04-04
asp.net實現(xiàn)圖片以二進(jìn)制流輸出的兩種方法
這篇文章主要介紹了asp.net實現(xiàn)圖片以二進(jìn)制流輸出的兩種方法,以簡單實例形式分析了asp.net實現(xiàn)以二進(jìn)制流形式讀寫圖片文件的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-12-12

