注:EF連接Mysql時,連接字符串是不能包含MARS的,Mysql不支持這個特性。
ADO.NET 1.n 利用SqlDataReader讀取數據,針對每個結果集需要一個獨立的連接。
這些獨立的鏈接也要占用相應的內存,在應用程序運行中還會形成高度擁擠的瓶頸效應。
ADO.NET 2.的一個新特征多數據結果集(Multiple Active Result Sets,簡稱MARS)
它允許在單個連接上執行多重的數據庫查詢或存儲過程。目前只適用於Sql Server 2005
在一個Command對象上同時打開多個DataReader,即可以在sqldatareader里面嵌套sqldatareader,
如果不用MultipleActiveResultSets ,則一般報錯為sqldatareader未關閉,即需要關閉了之后才能打開另一個
使用方法:在數據庫鏈接字符串后面加上MultipleActiveResultSets=true
例如:string connstr = "server=(local);database=northwind;integrated security=true;MultipleActiveResultSets=true";
MultipleActiveResultSets可以使數據庫連接復用。這樣就不怕數據庫的連接資源被耗盡了。使用方法很簡單,只需要把它加到數據的連接字符串中即可。
例如:server=(local);Integrated Security = true;database=AdventureWorks;MultipleActiveResultSets=true;
using System; using System.Threading; using System.Data.SqlClient; using System.Configuration; namespace ConsoleApplication1 { public class Example { public static void Main() { SqlConnection sql1 = new SqlConnection("server=(local);Integrated Security = true;database=AdventureWorks;"); sql1.Open(); SqlCommand comm1 = new SqlCommand(); comm1.CommandText = "select 1"; comm1.CommandType = System.Data.CommandType.Text; comm1.Connection = sql1; comm1.ExecuteNonQuery(); sql1.Close(); Console.ReadLine(); } } }
編譯后,打開bin/debug/ConsoleApplication1.exe。
在SQL Server 2008 Management Studio中打開一個新窗口,輸入sp_who
按F5執行,可以發現已經有一個用戶連接到AdventureWorks數據庫了。
再打開一個ConsoleApplication1.exe,發現又會多一個用戶連接到AdventureWorks數據庫。
現在把程序的連接字符串改為server=(local);Integrated Security = true;database=AdventureWorks;MultipleActiveResultSets=true;
按上面的順序執行,發現不管打開多少個ConsoleApplication1.exe,數據庫中沒有用戶或只有一個用戶連接着AdventureWorks數據庫。
這就是數據庫連接復用的好處了。