上一篇 | 下一篇

用多活动结果集优化ADO.NET2.0数据连接

发布: 2008-6-29 23:19 | 作者: admin | 来源: | 查看: 2次

  这个示例从数据库中读取单个销售订单(这里,订单号43659被硬编码)-该库中有一项目列表。这些项目应该从库存中扣除,而这是通过第二个连接完成的。然而,为了建立在第二个连接上的正确查询-从相应的产品中扣除正确的数量-要求第一个查询的结果在内存中被缓冲。并且在这个示例中这是通过使用两个数组列表来完成的。这里的明显耗费是:如果假定这是一个高度拥挤的网站,那么我们需要大量的缓冲内存来处理这些最终要被扔掉的数值。

  为此,你还有另外一个方法-通过同时打开两个连接并且使用从一连接中读取的数据结果-该连接被直接传递到在第二个连接上的更新命令;但是仍存在在打开多个连接时内存和数据库方面的代价。典型地,数据库连接对于一个应用程序来说比内存具有更高的代价,所以这里使用了顺序连接方式。

  MARS提供了解决这个问题的在以上两个方面均能达到最优的方法。你可以保持单个连接打开着,从而减少了到数据库的所有连接。这样以来,你就不需要用一个内存变量来存储读取的结果。

  而且,该MARS代码也为更短并且因此更易于读取和维护。下面的代码片断展示了在相同的操作上使用MARS的情况:

string connectionString = "Data Source=MEDIACENTER;" +

 "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +

 "MultipleActiveResultSets=True";

string strSQLGetOrder = "Select * from Sales.SalesOrderDetail" +

 "WHERE SalesOrderID = 43659";

string strSQLUpdateInv = "UPDATE Production.ProductInventory " +

 "SET Quantity=Quantity-@amt WHERE (ProductID=@pid)";

SqlConnection marsConnection = new SqlConnection(connectionString);

marsConnection.Open();

SqlCommand readCommand = new SqlCommand(strSQLGetOrder, marsConnection);

SqlCommand writeCommand = new SqlCommand(strSQLUpdateInv, marsConnection);

writeCommand.Parameters.Add("@amt", SqlDbType.Int);

writeCommand.Parameters.Add("@pid", SqlDbType.Int);

using (SqlDataReader rdr = 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!

字号: | 推荐给好友

22/2<12

评分:0

我来说两句