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命令時(shí),如果關(guān)閉關(guān)聯(lián)的DataReader對象,則關(guān)聯(lián)的Connection對象也將關(guān)閉 //用using(conn)會(huì)報(bào)錯(cuò),因?yàn)閳?zhí)行完命令就會(huì)關(guān)閉連接,其它代碼調(diào)用DataReader對象時(shí),連接已經(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方法中時(shí),會(huì)自動(dòng)釋放資源,如果中途出現(xiàn)了異常處理,也同樣會(huì)釋放掉占用的資源。
測試過程:這里由于沒有將全部分過程記錄下來,只是對結(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)了異常,此時(shí),程序會(huì)調(diào)到異常處理的模塊,這樣,就造成了下邊的close方法不會(huì)被執(zhí)行到,從而造成了數(shù)據(jù)庫連接數(shù)的不斷累加,當(dāng)達(dá)到最大值時(shí),問題就顯露出來了。
下邊第一種處理方式采用異常處理:
MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters); try{ while (dr.Read()) { keyWords.Add(dr["KeyWord"].ToString()); } } catch(){ } finnally{ dr.Close(); }
毫無疑問,這個(gè)方法很容易想到。
第二種處理方式,這里打算使用using方法進(jìn)行處理。但是根據(jù)理論知識,認(rèn)為這個(gè)是可以的。但是真實(shí)的程序運(yùn)行環(huán)境,確實(shí)有時(shí)不能以理論知識來指導(dǎo)。現(xiàn)在程序在這,有一個(gè)很合適的測試環(huán)境,為什么不自己測試下呢?于是就出現(xiàn)了一下的過程:
我是用的是MySql數(shù)據(jù)庫,C#編寫的程序。
首先補(bǔ)充一些基礎(chǔ)知識:
1、Using定義范圍:即時(shí)釋放資源,在范圍結(jié)束時(shí)釋放資源。當(dāng)在某個(gè)代碼段中使用了類得實(shí)例,而希望無論什么原因,只要離開了這個(gè)代碼段就自動(dòng)調(diào)用這個(gè)類實(shí)例的Dispose方法釋放資源。
到達(dá)using語句末尾或者中途引發(fā)了異常并且控制離開了語句塊,即觸發(fā)實(shí)例的Dispose方法釋放資源。
然后查看MySqlDataReader的實(shí)現(xiàn):
public sealed class MySqlDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord{...}
確實(shí)繼承了IDisposable方法,理論上應(yīng)該是正確的。
2、MySql查看連接數(shù):
命令: show processlist; 如果是root帳號,你能看到所有用戶的當(dāng)前連接。如果是其它普通帳號,只能看到自己占用的連接。
show processlist;只列出前100條,如果想全列出請使用show full processlist;
有了這兩點(diǎn)理論知識,下邊的測試就容易多了:
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í)行過程制作一個(gè)異常:
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中間制作一個(gè)異常:
Using(MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters)) { while (dr.Read()) { keyWords.Add(dr["Keyord"].ToString()); } }
測試,連接數(shù)未增加。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:ASP.NET MVC 開發(fā)微信支付H5的實(shí)現(xiàn)示例(外置瀏覽器支付)
欄 目:ASP.NET
本文標(biāo)題:DataReader不能使用using的詳細(xì)示例
本文地址:http://mengdiqiu.com.cn/a1/ASP_NET/10833.html
您可能感興趣的文章
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11VsCode之使用WebView通信詳解
- 01-11ASP.Net Core中使用枚舉類而不是枚舉的方法
- 01-11使用dotnet-dump 查找 .net core 3.0 占用CPU 100%的原因解析
- 01-11WCF中使用nettcp協(xié)議進(jìn)行通訊的方法
- 01-11.NET Core 3.0中WPF使用IOC的圖文教程
- 01-11.Net項(xiàng)目中NLog的配置和使用實(shí)例詳解
- 01-11使用.NET Core實(shí)現(xiàn)餓了嗎拆紅包功能
- 01-11.Net Core WebApi的簡單創(chuàng)建以及使用方法
- 01-11ASP.NET Core中使用MialKit實(shí)現(xiàn)郵件發(fā)送功能


閱讀排行
本欄相關(guān)
- 01-11vscode extension插件開發(fā)詳解
- 01-11VsCode插件開發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫個(gè)簡單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET開發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?