我有一些使用工作流基础的遗留代码,存在一些性能问题,我看到这种模式重复出现。 db.CreateCommand()
是否有任何预制成功,有没有其他方法可以创建DbCommand
对象?
DbCommand CreateCommand(DbConnection db)
{
using (var cmd = db.CreateCommand())
{
...
return cmd;
}
}
还有其他方法可以创建 DbCommand 对象吗?
不是以与提供者无关的方式。 由于使用的是抽象 DbConnection
1 类而不是特定的提供程序,因此需要使用 factory 方法来确保使用正确的连接类型。
请注意,通常连接由 .NET 池化,因此创建连接通常不是一个昂贵的过程。 如果您想了解实际情况中是否有性能问题,请尝试两种方式并衡量差异,否则您(和我们)只是猜测。
我还要重申评论中提到的内容,即您正在返回一个已处理的对象。 除了创建命令之外,尚不清楚您对命令执行的操作,但是返回已释放的对象可能会导致客户端尝试使用处于错误状态的对象并出现错误。 最好让客户端处理它,而不是这种方法。
会猜测对于这样的事情,您将受到的性能打击将非常小。要知道,一遍又一遍地创建新连接可能比重用同一连接的成本非常高,但不要认为一遍又一遍地创建命令会产生与打开和关闭连接的成本相同的效果与初始授权和建立连接有关。
您可以尝试使用一个连接并重用命令,如此处接受的答案所示:重用 SqlCommand?
基本上显示了如下所示的更详细示例
using(var connection = new SqlConnection(connectionString))
{
connection.Open();
using(var command = new connection.CreateCommand())
{
command.CommandText = "--Some Awesome Sql Here";
command.CommandType = CommandType.Text;
command.Parameters.AddWithValue("@awesomeVariable",1337);
/* Do Stuff until you need to make a new query / request */
command.CommandText = "StoredProcedureGuy";
//Get rid of old parameters
command.Parameters.Clear();
/* Rinse repeat */
}
}