准备语句和.NET中的内置连接池

时间:2011-06-13 20:04:58

标签: c# .net sql sql-server

我有一个长期运行的服务,有几个线程每秒调用以下方法数百次:

void TheMethod()
{
    using (var c = new SqlConnection("..."))
    {
        c.Open();

        var ret1 = PrepareAndExecuteStatement1(c, args1);
        // some code
        var ret2 = PrepareAndExecuteStatement2(c, args2);
        // more code
    }
}

PrepareAndExecuteStatement是这样的:

void PrepareAndExecuteStatement*(SqlConnection c, args)
{
    var cmd = new SqlCommand("query", c);
    cmd.Parameters.Add("@param", type);
    cmd.Prepare();
    cmd.Parameters["@param"] = args;

    return cmd.execute().read().etc();
}

我希望重用已准备好的语句,为每个连接准备一次并执行它们直到连接断开。我希望这会提高性能。

我可以使用内置连接池来实现此目的吗?理想情况下,每次建立新连接时,都应自动准备所有语句,并且我需要访问这些语句的SqlCommand对象。

1 个答案:

答案 0 :(得分:0)

建议采取略微修改的方法。使用后立即关闭您的连接。您当然可以重用SqlConnection。

//some code正在进行的工作可能需要很长时间。您是否正在与其他网络资源,磁盘资源进行交互,或者花费任何时间进行计算?在将来,你能不能这样做吗?也许执行语句之间的间隔可能很长,以至于您想要重新打开该连接。无论如何,Connection应该提前打开并提前关闭。

using (var c = new SqlConnection("..."))
{
    c.Open();
    PrepareAndExecuteStatement1(c, args);
    c.Close();
    // some code
    c.Open();
    PrepareAndExecuteStatement2(c, args);
    c.Close();
    // more code
}

Open Late, Close Early作为John Papa的MSDN杂志。

显然我们现在在这里有一堆代码重复。请考虑重构您的Prepare...()方法以执行开始和结束操作。

也许你会考虑这样的事情:

using (var c = new SqlConnection("..."))
{
    var cmd1 = PrepareAndCreateCommand(c, args);

    // some code
    var cmd2 = PrepareAndCreateCommand(c, args);

    c.Open();
    cmd1.ExecuteNonQuery();
    cmd2.ExecuteNonQuery();
    c.Close();
    // more code
}