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

C# 准备好的语句和.NET中的内置连接池,c#,.net,sql,sql-server,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, ar

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

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();
}
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
}
我希望重用准备好的语句,为每个连接准备一次并执行它们,直到连接中断。我希望这将提高性能


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

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

//某些代码中执行的工作可能需要很长时间。您是否正在与其他网络资源、磁盘资源进行交互,或花费大量时间进行计算?你将来是否需要这样做?执行语句之间的间隔可能太长,以至于您希望重新打开该连接。无论如何,连接应该晚开早关

using (var c = new SqlConnection("..."))
{
    c.Open();
    PrepareAndExecuteStatement1(c, args);
    c.Close();
    // some code
    c.Open();
    PrepareAndExecuteStatement2(c, args);
    c.Close();
    // more code
}
作为约翰·帕帕的MSDN杂志

显然,我们现在有一堆代码重复。考虑重构您的代码>准备…()<代码>方法来执行打开和关闭操作。< /P> 也许你会考虑这样的事情:

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();
}
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
}

我不明白你所说的“直到连接中断”是什么意思,也不明白调用不同的准备语句之间到底应该发生什么。这完全取决于
//某些代码是什么!如果有人重新启动SQL Server,现有连接将中断。在“某些代码”中,我处理语句的结果。结果集的大小是多少?如果SqlDataReader是较小的结果集,则可能需要使用它。此外,默认情况下还启用了连接池。当您打开()或关闭()连接时,您只是从池中获取或返回池。我可能不理解您的答案,但我认为这并不能解决我的问题。根据您的建议,我将继续准备语句(创建SqlCommand对象,设置查询字符串,定义每个参数的类型,调用.Prepare(),设置变量并执行查询。我只想在method()中设置变量并执行先前准备的语句@lzm:您实际上做得很正确,或者是按照建议做的。为每个语句创建一个新的SqlCommand。准备好的语句不应该准备一次并执行多次吗?