【问题标题】:"Randomly" occurring errors“随机”发生的错误
【发布时间】:2010-03-30 21:03:05
【问题描述】:

我的网站有一个设置,当应用程序启动时,会“创建”一个名为 SiteContent 的模块。这会运行一个清除函数,该函数基本上会从数据库中删除任何不相关的数据,以防之前运行的函数留下任何数据。

该模块具有管理器类的实例 - 即 RangeManager、CollectionManager、DesignManager。还有其他的,但我将仅以这些为例。每个 Manager 类都包含一个项目数组 - 项目可能是 Range、Collection 或 Design 类型,无论哪个是相关的。然后将每个范围的数据读入 Range、Collection 或 Design 的实例。我知道这基本上是在复制数据 - 效率不是很高,但这是我目前的最后一年项目,所以我可以随时将其更改为使用 Linq 或类似的东西,当我没有一个月的最后期限压力时。

我有一个表单,在单击“保存”按钮时,它通过调用 SiteContent.RangeManager.Create(vars) 或 SiteContent.RangeManager.Update(Range As Range, vars) (或其他管理器类的等效项,以任何一个为准)来保存数据一个恰好是相关的)。

这些函数调用存储过程在相关表中插入或更新。

类 Range、Collection 和 Design 都具有 Name、Description、Display 等属性。当调用 Create 或 Update 函数时,Manager 会遍历所有其他项目以检查是否已存在同名项目。 Update 函数确保它不会将正在更新的项目与自身进行比较。如果找到另一个具有相同名称的项目,则会引发自定义异常 (ItemAlreadyExistsException)。

出于某种奇怪的原因,如果我在编辑模式下进入 Range、Collection 或 Design,更改某些内容并尝试更新它,它偶尔不会更新该项目。当我说偶尔我的意思是每 3 - 4 个页面加载,有时更多。我完全看不到它发生的时间或原因。我有一个 try-catch 语句,它捕获 ItemAlreadyExistsException,并在捕获时输出“具有此名称的项目已经存在”。偶尔它会输出这个;其他时候不会。

有谁知道为什么会发生这种情况?也许是某人以前犯过并解决过的错误?

我曾经使用正则表达式来比较名称 - 我相信它是 [a-zA-Z]{1, 100}(介于 1 到 100 个小写或大写字符之间)。出于某种原因,我正在为其开发网站的客户经常收到错误消息,称其格式不正确。然而,他可以在 5 分钟后尝试相同的文本,并且效果很好。我认为这很可能是同一个问题,因为这两个问题都是随机发生的。

非常感谢。

问候,

理查德·克拉克

编辑:在花了很多时间缩小代码范围后,我决定等到我的兄弟,他做程序员至少比我多 8 年,复活节来让他看看在它。如果他不能解决,我会把文件压缩起来,放在某个地方供人们访问和尝试。

我将它从字面上缩小到尽可能少的文件数,但它仍然会发生。似乎大约每 10 次。话虽如此,我强制管理器类每 10 个页面加载或 5 分钟刷新一次(以较早者为准)。我可能会调查这个 - 这可能会导致问题。基本上每个 Manager 都包含一个对象数组。该数组是使用数据库中的数据填充的。 Update 函数采用项目的一个实例和要为该对象设置的新值。如果它恰好是重置数组的页面加载(即从数据库中新加载的数据),那么具有相同 ID 的对象实例将不会与传入的对象实例相同。这解释了这样一个事实:它不时抛出 ItemAlreadyExistsException。现在我越想越明白。如果我要传入要更改的对象的 ID,而不是对象本身,那么它应该可以正常工作。如果我解决了这个问题,我会回答..

【问题讨论】:

  • 几乎不可能在没有看到您的代码的情况下进行诊断。请发布最少的重复问题的代码。
  • 同意,你使用什么样的数据库,MySQL?是存储为 myisam、innodb 等的表。您是否在表单中使用 method="post" 而不是 method="get" ...只是为了确保浏览器不会缓存结果...
  • 嗯,这就是问题所在 - 缩小它可能需要几个小时,因为它都与数据库和存储过程等相关联。我只是尝试编辑一个集合,它告诉我已存在同名的项目。 CollectionManager 中只有一个地方会引发此异常,但其他集合都没有相同的名称。我使用 For Each Collection As Collection In Items,然后 If String.Compare(__Collection.Name, Collection.Name, True (IgnoreCase)) = 0 Throw New ItemExistsException().. 我看不出有什么问题。问候,理查德
  • 我使用的是 SQL Server 2008(带有 Web Developer 2008)。错误随机发生在服务器上的测试和实时站点上。我会尝试找一些地方来共享文件,这样我就可以把相关的文件放在那里,并附上自述文件来帮助设置数据库。我对这种事情不太了解,所以有人对我可以在哪里共享文件有任何想法吗?问候,理查德
  • 试试pastebin.com

标签: .net asp.net vb.net exception exception-handling


【解决方案1】:

Woohoo 看来我已经解决了这个问题。在(我认为)按钮单击事件被调用之前,在页面初始化事件中调用了刷新子。因此,每个经理的项目都被重新创建/填充。通过将子调用从 init 移动到 loadcomplete,我似乎设法解决了问题。

它仍然没有解决客户被告知他不能放置特定字符串然后它在一段时间后成功的问题..一定是一个不同的问题,因为刷新是最近才实施的..但是至少有一个问题似乎得到了解决。

感谢您的帮助。

问候,

理查德

【讨论】:

    【解决方案2】:

    更多信息:我已经在整个站点范围内实施了更改,但发现它们不起作用(也许我错过了一两个更改或其他什么......)并撤消了更改。然而,我很快意识到“数据刷新”机制已经到位,仅仅是因为我们在同一数据库上运行了两个应用程序,因为我们希望尽快让网站上线。自上线之日起,经过一番折腾,我设法将所有测试数据复制到实时数据库并交换实时站点以使用实时数据库,因此不再需要刷新数据。

    基本上,因为数据被加载到类的实例中,它们都有效地创建了自己的数据源,直到应用程序被回收。这意味着他们暂时独立运行。测试中有一些功能没有在现场,一些在现场没有在测试中,所以要对需要仅测试和仅现场功能的一项进行多项更改,您必须在测试中进行更改,等到现场应用程序被回收,然后在现场进行任何必要的更改。这就是我决定创建 10 页刷新机制的原因——所以 live 最多必须刷新 10 次才能使数据保持最新。解释为什么它们不大致相同有点复杂,但基本上测试有一个功能齐全但有点小故障的管理前端和一个有问题的客户前端,而 live 修复了所有客户前端的错误,几乎没有任何功能在管理前端,但是那里的一些位没有错误,并且那里也放了一些额外的位。几个月前我的笔记本电脑被盗了,所以在没有备份代码的情况下,我不得不反编译测试站点并调试反编译的代码,然后才能通过实时站点的功能进一步推进。当我尝试反编译测试 DLL 并赶上实时站点时,客户希望仍然使用测试版本的功能,但希望我优先考虑测试站点中不存在的一些功能 - 因此我们必须让它们都运行在同一个数据库上。我希望这可以消除任何人可能对为什么如此复杂的任何困惑。

    总而言之,我通过完全删除刷新功能找到了解决问题的方法,这主要是由于在同一个数据库上运行实时和测试,但功能数量和故障数量非常不同.这基本上是由于不得不急于让网站为上线日期做好准备,同时赶上我的笔记本电脑被盗并且不得不为测试网站反编译 DLL。

    问候,

    理查德

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2019-03-25
      相关资源
      最近更新 更多