我应该为每个查询打开和关闭数据库吗?

时间:2011-03-14 20:40:41

标签: c# ado.net

我正在使用C#的旧学校ADO.net,因此有很多这样的代码。为每个查询创建一个函数并每次打开和关闭数据库,或者使用相同的连接对象运行多个查询是否更好?以下只是一个查询,仅供参考。

 using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnectMain"].ConnectionString))
    {
        // Add user to database, so they can't vote multiple times
        string sql = " insert into PollRespondents (PollId, MemberId) values (@PollId, @MemberId)";

        SqlCommand sqlCmd = new SqlCommand(sql, connection);

        sqlCmd.Parameters.Add("@PollId", SqlDbType.Int);
        sqlCmd.Parameters["@PollId"].Value = PollId;

        sqlCmd.Parameters.Add("@MemberId", SqlDbType.Int);
        sqlCmd.Parameters["@MemberId"].Value = Session["MemberId"];

        try
        {
            connection.Open();
            Int32 rowsAffected = (int)sqlCmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            //Console.WriteLine(ex.Message);
        }
    }

5 个答案:

答案 0 :(得分:11)

嗯,你可以衡量;但是只要你是using连接(因此即使你得到异常它们也会被丢弃),并且启用了池(对于SQL服务器它默认是启用的)它并不重要;关闭(或处理)只是将底层连接返回到池。两种方法都有效。对不起,这没什么用; p

在执行其他冗长的非数据库工作时,不要保持打开连接。关上它并重新打开;你可能实际上得到了相同的底层连接,但是其他人(另一个线程)可能已经使用它而你不是。

答案 1 :(得分:7)

对于大多数情况,每个查询打开和关闭一个连接是要走的路(正如Chris Lively指出的那样)。但是,在某些情况下,您会遇到使用此解决方案的性能瓶颈。

例如,在处理依赖于先前结果的大量相对快速执行的查询时,我可能建议在单个连接中执行多个查询。在进行数据批处理或数据按摩以进行报告时,您可能会遇到此问题。

不管你遵循哪种模式,总是一定要使用'using'包装来避免内存泄漏。

答案 2 :(得分:3)

如果方法的结构使得单个命令在单个方法中执行,那么是:实例化并处理每个命令的连接。

如果方法的结构使得您在同一代码块中执行了多个命令,则外部块必须是连接的using子句。

ADO非常适合连接池,因此实例化和处理命令对象的速度非常快,实际上不会影响性能。

作为示例,我们有几个页面将执行50个查询的更新以组成页面。因为有分支代码来确定要运行的查询,所以我们将每个查询包含在自己的using (connection...)子句中。

我们曾经把它们撕掉并抓住一个连接对象并将其传递给各个方法。这几乎没有性能改进,同时使代码完全复杂化,所有的异常条款都确保连接在最后得到妥善处理。在测试结束时,我们将代码回滚到之前的状态。更清楚地知道发生了什么以及何时使用连接。

答案 3 :(得分:2)

嗯,一如既往,这取决于。如果您在同一个方法调用中进行了5次数据库调用,则应该使用单个连接。

但是,从可扩展性的角度来看,通常不建议在没有任何事情发生时保持连接。

答案 4 :(得分:2)

ADO.NET现在是老派吗?哇,你让我觉得自己老了。对我来说,在Windows 3.1上使用Borland C ++的Rogue Wave ODBC是老派。

要回答,通常您想了解数据驱动程序的工作原理。理解连接池等概念,并学习分析与连接/断开连接和执行查询相关的事务成本。然后掌握这些知识并将其应用于您的情况。

相关问题