3

我有一个存储过程,它因“超时已过期”而出错。

涉及的代码是ADO/VB6。

存储过程本身没有问题,您可以在查询窗口中运行它,只需不到一秒钟。

用于获取连接等的代码也是模块化的,并在整个巨大的应用程序中使用。超时仅在这个地方发生,在一个特定的数据库上。

无论是否在调试中运行 VB6 代码,每次尝试都会重现该错误,然后突然间一切都会神奇地重新开始工作。然后在未来的某个时间,同样的问题会再次出现。

我不确定要放多少代码,没有什么复杂的;基本上是;

Set adoCommandObject.ActiveConnection = ...{open ADODB.Connection object}
Set rs = CreateObject("ADODB.Recordset")
Call rs.Open(adoCommandObject, , adOpenForwardOnly, adLockReadOnly)'Timeout occurs here

我一直在观察分析器,但没有给出任何线索,除了偶尔看到在 sp 运行之前和之后发生的“SET NO_BROWSETABLE ON”/“SET NO_BROWSETABLE OFF”语句。

我已经在网上搜索过,但找不到任何令人满意的帮助;在这一点上,我愿意尝试任何事情(除了在 .NET 中重写,不幸的是,这不是一个选项!)

4

2 回答 2

3

我认为你想太多了。无意冒犯,但如果你使用的是 MSSQL,它就像有人打开查询窗口一样简单,它会占用数据库。这很容易测试。我以前也遇到过同样的麻烦。我之前已经运行过存储过程,没有超时,通常会立即运行,但会在一夜之间运行而不运行。只是为了发现另一名员工打开了他们的查询窗口。关闭他们的窗口,然后它终于运行了。看看这个,你会惊讶于表锁可以对你的应用程序做些什么。

我这么说是因为你说问题是间歇性的。它来来去去。我怀疑是表锁。无论是应用程序执行此操作,还是由另一个用户对数据库进行查询来完成。如果不是其他用户,请检查以确保您的应用程序在每次使用它们时都关闭与数据库的连接。

于 2009-06-24T14:49:53.767 回答
0
  • 也许有一些潜伏的代码意外地将连接或命令的超时设置为一个非常小的值。
  • 也许程序确实偶尔需要一段时间才能运行,例如,如果服务器正在执行其他操作或统计信息已过时
  • 您能否使用探查器捕获超时情况,如果是这样,proc 实际上是否需要很长时间才能执行?

如此处所述SET NO_BROWSETABLE ON 类似于在选择中使用FOR BROWSE。我猜它是 ado 自动生成的,它认为您可能想要更新该记录集。您可以设置 Recordset 的一个属性来阻止那些被发布,但这似乎不太可能是问题所在。

于 2009-05-22T18:15:03.983 回答