成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DataReader鏈接關閉解惑篇

運維 數據庫運維 SQL Server
看到有帖子:DataReader的關閉問題疑惑篇 ,大伙對鏈接關閉問題看似比較迷惑,這里就給解說一下:不管是啥xxDataReader,都是繼承DataReader實現的,所以是有共性的,因此標題就以DataReader為題了。

看到有帖子:DataReader的關閉問題疑惑篇 ,大伙對鏈接關閉問題看似比較迷惑,這里就給解說一下:

不管是啥xxDataReader,都是繼承DataReader實現的,所以是有共性的,因此標題就以DataReader為題了。

情況一:DataReader 默認鏈接不關閉

示例代碼:

  1. static void Main(string[] args)  
  2. {  
  3.     SqlConnection con = new SqlConnection("server=.;database=MySpace;uid=sa;pwd=123456");  
  4.     con.Open();  
  5.     SqlCommand com = new SqlCommand("select top 1 id from blog_user",con);  
  6.     SqlDataReader sdr = com.ExecuteReader(System.Data.CommandBehavior.CloseConnection);  
  7.     while (sdr.Read())  
  8.     {  
  9.     }  
  10.     Console.WriteLine(sdr.IsClosed);  
  11.     Console.WriteLine(con.State.ToString());  
  12.     Console.ReadLine();  

結論是:

False

Open

說明:默認無論是不是加System.Data.CommandBehavior.CloseConnection,讀取時數據庫鏈接不會幫你關閉。

情況二:DataReader 鏈接已關閉

示例代碼:[以下是原文的代碼]

  1. protected void bind()  
  2. {  
  3.     SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ToString());  
  4.     conn.Open();  
  5.     SqlCommand cmd = new SqlCommand("GetAllUser", conn);  
  6.     SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);  
  7.     repeater1.DataSource = sdr;  
  8.     repeater1.DataBind();  
  9.     Response.Write(sdr.IsClosed.ToString() + "<br/>");  
  10.     Response.Write(conn.State.ToString());  
  11. }  

結果是:

True

Closed

情況:System.Data.CommandBehavior.CloseConnection加完之后,鏈接給你關閉了,為啥?看下面的分析原因。

三:分析原因

1:從前面的兩個示例上看,區別是什么?

答:區別就在于一個只讀數據,另一個綁定了數據列表控件。

2:為什么綁定了數據列表控件就會自動關閉鏈接?

答:這就涉及到數據控件綁定機制了,這里給大伙簡單介紹一下:

A:要實現數據控件列表綁定,有一個接口是需要實現的:IEnumerable

B:實現DataReader實現此接口的代碼[基類是抽象方法,所以只能到子類SqlDataReader查看]:

  1. public override IEnumerator GetEnumerator()  
  2. {  
  3.     return new DbEnumerator(this, (this._commandBehavior & CommandBehavior.CloseConnection) ==     CommandBehavior.CloseConnection);  
  4. }  

從這代碼里,我們只看到了它把CloseConnection傳進DbEnumerator里了,再進去看一下:

  1. public DbEnumerator(IDataReader reader, bool closeReader)  
  2. {  
  3.     if (reader == null)  
  4.     {  
  5.         throw ADP.ArgumentNull("reader");  
  6.     }  
  7.     this._reader = reader;  
  8.     this.closeReader = closeReader;//此行設置了標志  
  9. }  

點進去只看到構造函數,并把它賦給this.closeReader屬性,因為DataReader是向前讀方式,所以重點還是要看其中的一個方法MoveNext:

  1. public bool MoveNext()  
  2. {  
  3.     if (this._schemaInfo == null)  
  4.     {  
  5.         this.BuildSchemaInfo();  
  6.     }  
  7.     this._current = null;  
  8.     if (this._reader.Read())//此方法被調用一次,就讀一次  
  9.     {  
  10.         object[] values = new object[this._schemaInfo.Length];  
  11.         this._reader.GetValues(values);  
  12.         this._current = new DataRecordInternal(this._schemaInfo, values, this._descriptors, this._fieldNameLookup);  
  13.         return true;//有數據時直接返回,不會執行下面的關閉鏈接  
  14.     }  
  15.     if (this.closeReader)//好,能進行這里,說明上面讀不到數據,簡說就是數據讀完了  
  16.     {  
  17.         this._reader.Close();//關閉鏈接操作。  
  18.     }  
  19.     return false;  
  20. }  

以上代碼就看我注釋的說明。

C:為什么用DataReader綁定列表控件是耍流氓?

答:因為服務端控件列表渲染出表格的周期通常比較長,所以,只有等到你看到最后結果列表出來的時候,最后一行數據才讀完。

因此鏈接是持續相當長的處于打開狀態,所以web這種并發多的情況,狂點幾下,估計就報錯了,鏈接池用滿了。

四:最終結論是什么?

1:在綁定列表控件時,只要數據行讀取完畢,就會自動關閉鏈接。

2:在直接讀取時,不會觸發綁定相關的讀取,所以不會自動關閉鏈接。

3:在綁定列表控件時,鏈接長期得不到關閉,并發一來,就掛了,因此大伙就不要耍流氓了。

原文鏈接: http://www.cnblogs.com/cyq1162/archive/2011/04/06/2006412.html

責任編輯:艾婧 來源: 博客園
相關推薦

2011-04-07 09:20:12

DataReader關閉問題

2010-05-24 18:16:52

MySQL數據庫

2009-12-17 14:56:11

Ruby關閉IE進程

2009-12-21 18:32:22

關閉WCF鏈接

2009-09-03 10:26:07

C#修改DataRea

2009-11-04 12:45:33

ADO.NET Dat

2011-04-28 11:04:22

DataReader分頁

2016-10-14 15:00:45

2017-07-11 16:45:51

Python整數比較

2017-09-12 15:56:43

邊緣計算云計算架構

2011-04-14 09:42:06

DataReaderDataSet

2021-02-04 17:06:46

工具代碼開發

2009-10-29 11:08:20

ADO.NET Dat

2009-07-20 10:36:29

什么是JDBC

2012-03-23 14:02:11

云計算

2019-04-02 10:50:05

框架Spring開發

2019-03-25 20:46:22

混合IT云計算私有云

2010-04-07 11:09:53

2018-06-06 10:14:32

Kafka時間輪任務

2009-11-13 10:31:07

ADO.NET Dat
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 毛片免费在线观看 | 欧美日韩中文字幕在线 | 在线看免费 | 国产精品 欧美精品 | 国产成人a亚洲精品 | 国产精品免费观看 | a在线观看 | 欧美综合久久 | 中文成人在线 | 久久久毛片 | 日韩精品一区二区三区中文在线 | 精品久久精品 | 一区二区三区国产 | 亚洲精品在线视频 | 免费的av网站| 亚洲精品国产综合区久久久久久久 | 久久国产精品精品国产色婷婷 | 日日天天 | 日本不卡视频 | 九九视频在线观看视频6 | 51ⅴ精品国产91久久久久久 | 中文字幕欧美一区二区 | 国产日韩av一区二区 | 成人福利电影 | av男人的天堂av | 新超碰97| 中文字幕一区二区三区乱码图片 | 日日夜精品视频 | 免费高潮视频95在线观看网站 | 亚洲字幕在线观看 | 国产精品久久久久一区二区三区 | 欧美在线天堂 | 97视频在线观看网站 | 国产精品永久 | 欧美综合在线观看 | 成人免费在线小视频 | 精品国产乱码久久久久久丨区2区 | 亚洲国产精品久久久 | 国产精品中文字幕在线观看 | 亚洲视频一区在线 | 亚洲综合首页 |