ExecuteSP
我有一个 MVC 4 Web 应用程序,它调用异步调用数据层方法的业务层。数据层方法 ExecuteSP 调用一个长时间运行的存储过程,如下所示:
public class MainDataLayer
{
private Database database; //Enterprise library 5
private DbCommand dbc;
private List<SPParams> spParams;
public MainDataLayer()
{
_database = DatabaseFactory.CreateDatabase("strConn");
//set multiple sp params like the one below
_spParams.Add(new SPParams() { ParamName = "@pID", ParamValue = ID });
}
public DataSet ExecuteSP()
{
dbc = database.GetStoredProcCommand('long_running_sp');
dbc.CommandTimeout = 300;
foreach (SPParams p in spParams)
{
dbc.Parameters.Add(new SqlParameter(p.ParamName, p.ParamValue));
}
DataSet ds = _database.ExecuteDataSet(dbc);
return ds;
}
}
//this class is used in the class above for setting the sp parameters
public class SPParams
{
public string ParamName { get; set; }
public object ParamValue { get; set; }
}
长时间运行的存储过程有一些插入和一些更新,最后的超时调用如下所示,以模拟长时间运行的过程。
WAITFOR DELAY '0:02:00'
问题是,当我通过从客户端 pc A 部署在测试服务器上的 Web 应用程序调用此存储过程时,它会挂起来自同一客户端或任何其他调用该网页的用户的所有进一步调用,直到存储过程中的 2 分钟过去。当我直接从 sql management studio 运行存储过程并并排运行另一个 sql 语句时,存储过程需要 2 分钟才能执行,而另一个 sql 语句会立即执行。看起来数据库端没有我需要更改的东西。我的代码可能有什么问题?
谢谢