gpt4 book ai didi

sql-server - ADO.NET 调用 T-SQL 存储过程导致 SqlTimeoutException

转载 作者:行者123 更新时间:2023-12-03 06:35:57 26 4
gpt4 key购买 nike

我有一个带有签名的 T-SQL 存储过程

CREATE PROCEDURE MyProc
@recordCount INT OUTPUT
@param1 INT
...

当直接在 Sql Server 中执行时,该过程运行时间不到 5 秒,返回一些结果集,总计约 100 行。

使用 ADO.NET 调用此过程 SqlDataAdapter.Fill填充 Dataset 的方法导致SqlTimeoutException关于SqlCommand 3分钟后(指定的超时间隔)。

更改存储过程,使其不再具有输出参数,并将所需的输出值作为最后一个结果集返回,解决了问题,整个过程按预期在 5 秒内运行。

但是为什么呢?

我不想在不了解我是否真正解决了问题的情况下浏览我的代码库并修改此类行为的所有实例。

另一件事需要注意的是,这仅在一个特定服务器上明显,无可否认,该服务器具有比我们运行的其他类似数据库更大的数据集。肯定不是 Sql Server 设置吗?

更新

进入框架源代码,问题似乎出在元数据检索中。 ConsumeMetaData SqlDataReader的方法对象无限期挂起。但是,我在其他数据库上运行了测试,但无法重现,因此当通过 ADO.NET 调用此过程时,这是一个数据库特定问题...太棒了。

更新二

已确认,如果我更改代码以使用OleDbDataAdapter,问题仍然会发生。与 SQLOLEDB 或 SQLNCLI 提供程序类型。绝对与连接有关。

最佳答案

一旦我确定问题的根源在于 ADO.NET 连接,则 thread让我找到了答案。

基本上,默认情况下通过 Sql Server Management Studio (SSMS) 的连接具有 SET ARITHABORT ON。 ADO.NET 连接则不然。

设置 ARITHABORT OFF 并直接通过 SSMS 执行查询也会导致同样缓慢的响应时间。

使用或不使用此设置运行时的主要区别是为两个调用创建不同的查询计划。当 ARITHABORTOFF 时,SSMS 命令将使用 ADO.NET 连接正在使用的预编译缓存查询计划,因此会超时。

通过以管理员身份在数据库上运行以下命令,所有查询都会按预期运行,无论 ARITHABORT 设置如何。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

我只能假设编译的查询计划已损坏或无效。

我将以此作为另一个 thread 的解决方案(我已经对答案进行了投票)

谢谢。

关于sql-server - ADO.NET 调用 T-SQL 存储过程导致 SqlTimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/834124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com