我有一个长期运行的服务,有几个线程每秒调用以下方法数百次:
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对象。
答案 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
}