ExecuteDataSet 超时发生在非常快速的存储过程上

Posted

技术标签:

【中文标题】ExecuteDataSet 超时发生在非常快速的存储过程上【英文标题】:ExecuteDataSet timeout occurs on very quick stored procedure 【发布时间】:2013-11-08 15:02:42 【问题描述】:

我正在尝试调试在我们的一个旧系统中出现的问题。

这是有问题的代码

DataSet content = new DataSet();

Database db = DatabaseFactory.CreateDatabase();
DbCommand cmdSearchQuestionLibrary = db.GetStoredProcCommand("CUP_Reports_GetTrainerPerformanceReport");
db.AddInParameter(cmdSearchQuestionLibrary, "@PartnerID", DbType.Int64, partnerId);
db.AddInParameter(cmdSearchQuestionLibrary, "@StartDate", DbType.DateTime, dtStartDate);
db.AddInParameter(cmdSearchQuestionLibrary, "@EndDate", DbType.DateTime, dtEndDate);
db.AddInParameter(cmdSearchQuestionLibrary, "@TrainerId", DbType.Int32, trainerId);
db.AddInParameter(cmdSearchQuestionLibrary, "@AssessmentType", DbType.Int32, assessmentType);

content = db.ExecuteDataSet(cmdSearchQuestionLibrary);

超时发生在db.ExecuteDataSet。我在 SQL Server Profiler 中对此进行了跟踪,并对同一个数据库运行相同的查询,并且返回数据只需不到一秒钟的时间。

如果我延长超时时间,我可以看到返回相同数据需要一分钟以上,这是不可接受的。

这里有什么我想念的吗?我想知道db.GetStoredProcCommand 是否正在打开一个需要关闭的连接,它只是在等待该连接关闭。

【问题讨论】:

数据库工厂是命名空间 Microsoft.Practices.EnterpriseLibrary.Data 的一部分,它是“用于调用默认数据库对象的方法。从 // ConnectionSettings.config 文件中读取默认设置。”这是 我很想运行 Visual Studio 分析器并查看代码中的确切位置,并以这种方式追踪问题。但是,您正在创建和使用内存的数据集有多大? 它只返回 1 行数据,4 列都是非常小的数据。即 67.5,Connect,2,Cambridge Admin 嗯...关于企业库数据访问应用程序块有一些已知问题,即添加参数可能比直接使用 ADO.NET 慢 100 倍?我很想对直接 ADO 方法进行测试,看看结果如何,请参阅support.microsoft.com/kb/310070 以获得简单的参考示例。 快速阅读entlib.codeplex.com/workitem/32858 【参考方案1】:

在尝试了几件事后,发现解决方案是将WITH Recompile 添加到存储过程中。似乎数据库持有一个错误的执行计划。

【讨论】:

以上是关于ExecuteDataSet 超时发生在非常快速的存储过程上的主要内容,如果未能解决你的问题,请参考以下文章

socket心跳超时检测,快速处理新思路(适用于超大量TCP连接情况下)

在庞大的 mongodb 集合中快速搜索非常稀有的字段

4-8:TCP协议之拥塞控制(慢启动拥塞避免拥塞发生和快速恢复)

Dapper.net 的奇怪超时问题

phpMyAdmin 错误 504 网关超时重新加载

Spring Security 会话超时太短