|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
其实Java之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是Java的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。ado|数据|优化 浏览提要接待参予会商MARS的利用!经由过程这里先容的MARS手艺上,你可以在单个毗连上实行多重数据库查询。并且依附于MARS手艺的编码更加复杂易读,而且使你在开辟数据会合的Web使用程序时能够削减内存利用并在必定程序上打消功能瓶颈。岂非你不想实验一下MARS?
多举动了局集(MultipleActiveResultSets,简称MARS)是ADO.NET2.0的一个新特性-它同意在单个毗连上实行多重的数据库查询或存储历程。如许的了局是,你可以在单个毗连上失掉和办理多个、仅向前援用的、只读的了局集。在MARS之前,针对每一个了局集必要一个自力的毗连。固然,你还必需办理这些毗连而且要支付响应的内存和潜伏的使用程序中的高度拥堵的瓶颈价值-出格是在数据会合的Web使用程序中。
第一个撑持MARS的贸易数据库是SQLServer2005,在本文中你将会具体懂得如何利用这一强无力的但是倒是易于增加到ADO.NET开辟中往的工具。
当在之前版本的SQLServer中存取数据了局集时,你必要创立分外的SqlConnection工具以共同利用SqlCommand。你必要追踪你的一切了局集及其招致低效力程序的SqlConnections毗连和"ThereisalreadyanopenDataReaderassociatedwiththisConnection"毛病。如今,利用了MARS手艺后,一切这些都成了已往。
1、筹办事情
最入手下手,你必要设置一新的毗连字符串以启动多个举动毗连。天然地,我们把这个设置定名为"MultipleActiveResultSets",而且以下利用之:
StringconnectionString="DataSource=DBSERVER;"+
"InitialCatalog=AdventureWorlds;IntegratedSecurity=SSPI;"+
"MultipleActiveResultSets=True";
它的默许设定是"False",而且你能明白地禁用它-假如你想传送"False"给这个MultipleActiveResultSets设定的话。
请遵守上面步骤来创建和启动MARS和ADO.NET2.0:
1.创立一个如下面所示的毗连字符串。
2.创立一个SqlConnection工具而且用该毗连字符串初始化它。
3.利用它的Open()办法翻开这个SqlConnection工具。
4.关于你想要实行的每一个查询,创立一个新的SqlCommand工具。把它们与你在下面创立并翻开的SqlConnection工具相干联。
5.利用得当的命令(如,假如你想读该取查询了局的话,可使用ExecuteReader();或利用ExecuteNonQuery()来举行更新,等等)来实行查询。
6.完成后,封闭SqlConnection工具。
2、实战
在实践开辟中广泛存在的一种典范的从数据库中读写数据的情况是,你可使用多重毗连而如今只用一个毗连就充足了。比方,假如你有一些来自于几个表中的数据-它们不克不及被联合到一个查询中,那末你就会有多重的毗连-每一个毗连都有一个与之相干连的命令用于读取数据。一样,假如你正在向一个表写数据,那末你必要别的一个毗连或毗连汇合-假如有多个表要被更新的话。
能够思索如许的情况-你必要读取来自两个查询A和B中的数据-从大概要写向表C的数据猎取值,而且对你要写向表D的举动坚持一个审计纪录。在云云情况中,你的代码大概以下:
・为A翻开一个毗连
・实行查询A,而且添补一个数据集
・为A封闭一个毗连
・为B翻开一个毗连
・实行查询B,而且添补一个数据集
・为B封闭一个毗连
・为C翻开一个毗连
・为D翻开一个毗连
・用从A和B中获得的具体数据更新C
・用做过的审计标志更新D
・封闭D
・封闭C
这是相称庞大的!
当利用MARS时,你只需完成以下:
・用"MultipleActiveResultSets=true"翻开毗连
・实行A而且添补一个数据集
・实行B而且添补一个数据集
・用从A和B中获得的具体数据更新C
・用做过的审计标志更新D
・封闭毗连
更复杂!
<P> 3、基于MARS和C#的示例剖析
本示例利用了伴同SQLServer2005一同刊行的AdventureWorks示例数据库,而且利用了该数据库的开辟版。注重,它还要改动该库的一些字段的内容,因而假如你想把这个示例数据库用于其余目标,请注重这一点。
本示例将展现如何从数据库中读取一个SalesOrder,然后削减已卖出的项目标库存数额。典范地,这将请求创建到数据库的两个按次毗连-一个用于读取售出的项目数额,另外一个用于利用削减的数额来更新库存。
上面的代码片段显现了如何在不利用MARS功效的情形下到达这一目标。
ArrayListids=newArrayList();
ArrayListqtys=newArrayList();
stringconnectionString="DataSource=MEDIACENTER;"+
"InitialCatalog=AdventureWorks;IntegratedSecurity=SSPI;"+
"MultipleActiveResultSets=False";
stringstrSQLGetOrder="Select*fromSales.SalesOrderDetail"+
"WHERESalesOrderID=43659";
SqlConnectionreadConnection=newSqlConnection(connectionString);
readConnection.Open();
SqlCommandreadCommand=newSqlCommand(strSQLGetOrder,readConnection);
using(SqlDataReaderrdr=readCommand.ExecuteReader()){
while(rdr.Read()){
ids.Add(rdr["ProductID"]);
qtys.Add(rdr["OrderQty"]);
}
}
readConnection.Close();
stringstrSQLUpdateInv="UPDATEProduction.ProductInventory"+
"SETQuantity=Quantity-@amtWHERE(ProductID=@pid)";
SqlConnectionwriteConnection=newSqlConnection(connectionString);
writeConnection.Open();
SqlCommandwriteCommand=newSqlCommand(strSQLUpdateInv,writeConnection);
writeCommand.Parameters.Add("@amt",SqlDbType.Int);
writeCommand.Parameters.Add("@pid",SqlDbType.Int);
for(intlp=0;lp<ids.Count;lp++){
writeCommand.Parameters["@amt"].Value=qtys[lp];
writeCommand.Parameters["@pid"].Value=ids[lp];
writeCommand.ExecuteNonQuery();
}
writeConnection.Close();
这个示例从数据库中读取单个发卖定单(这里,定单号43659被硬编码)-该库中有一项目列表。这些项目应当从库存中扣除,而这是经由过程第二个毗连完成的。但是,为了创建在第二个毗连上的准确查询-从响应的产物中扣除准确的数目-请求第一个查询的了局在内存中被缓冲。而且在这个示例中这是经由过程利用两个数组列表来完成的。这里的分明泯灭是:假如假定这是一个高度拥堵的网站,那末我们必要大批的缓冲内存来处置这些终极要被抛弃的数值。
为此,你另有别的一个办法-经由过程同时翻开两个毗连而且利用从连续接中读取的数据了局-该毗连被间接传送到在第二个毗连上的更新命令;可是仍存在在翻开多个毗连时内存和数据库方面的价值。典范地,数据库毗连关于一个使用程序来讲比内存具有更高的价值,以是这里利用了按次毗连体例。
MARS供应懂得决这个成绩的在以上两个方面均能到达最优的办法。你能够坚持单个毗连翻开着,从而削减了到数据库的一切毗连。如许以来,你就不必要用一个内存变量来存储读取的了局。
并且,该MARS代码也为更短而且因而更容易于读取和保护。上面的代码片段展现了在不异的操纵上利用MARS的情形:
stringconnectionString="DataSource=MEDIACENTER;"+
"InitialCatalog=AdventureWorks;IntegratedSecurity=SSPI;"+
"MultipleActiveResultSets=True";
stringstrSQLGetOrder="Select*fromSales.SalesOrderDetail"+
"WHERESalesOrderID=43659";
stringstrSQLUpdateInv="UPDATEProduction.ProductInventory"+
"SETQuantity=Quantity-@amtWHERE(ProductID=@pid)";
SqlConnectionmarsConnection=newSqlConnection(connectionString);
marsConnection.Open();
SqlCommandreadCommand=newSqlCommand(strSQLGetOrder,marsConnection);
SqlCommandwriteCommand=newSqlCommand(strSQLUpdateInv,marsConnection);
writeCommand.Parameters.Add("@amt",SqlDbType.Int);
writeCommand.Parameters.Add("@pid",SqlDbType.Int);
using(SqlDataReaderrdr=readCommand.ExecuteReader()){
while(rdr.Read()){
writeCommand.Parameters["@amt"].Value=rdr["OrderQty"];
writeCommand.Parameters["@pid"].Value=rdr["ProductID"];
writeCommand.ExecuteNonQuery();
}
}
marsConnection.Close();
正如你所见,这里的体例在内存和数据库毗连方面比上一个示例更容易于读取和办理且更加无效。而且,在这类情形中,只读取一次,随后随着的是写操纵;在某种典范情况下你的不利用MARS功效的代码有大概更加庞大,并因而使得MARS为你带来的节俭更加分明。
只管MARS便当了在统一个毗连上的多重举动了局集的操纵,可是在这些了局集上的操纵仍旧是串交运行的;假如你请求并行处置数据,那末多毗连仍是必须的。并且,请注重,一个利用了MARS功效的毗连要比不利用的毗连将使用更多些的资本。固然,从久远来看,你却勤俭了资本-因为你能够在统一个毗连上实行多个命令;可是假如你在不必要的中央利用了MARS(也就是,假如你只必要单个了局集),你将会严峻地影响体系功能。因而,假如你是在基于多半据库毗连构建一个使用程序,那末你必需仔细思索哪些毗连必要MARS,而哪些毗连不必要-为了最年夜限制天时用资本。
总之,MARS是在ADO.NET中新增的一个十分优异的功效-它同意你更高效地编写使用程序。接待利用MARS!
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。 |
|