2010-03-30 124 views
0

我的网站有一个设置,当应用程序启动一个名为SiteContent的模块是“创建”的。这将运行一个清除功能,基本上从数据库中删除任何不相关的数据,以防从先前运行的功能中留下任何不相关的数据。“随机”发生的错误

该模块具有Manager类的实例 - 即RangeManager,CollectionManager,DesignManager。还有其他的,但我会用这些作为例子。每个Manager类都包含一系列项目 - 项目可以是Range,Collection或Design类型,无论哪一个都是相关的。然后将每个范围的数据读入范围,集合或设计的实例。我知道这基本上是复制数据 - 效率不是很高,但是它是我目前的最后一年项目,所以我可以随时将它改为使用Linq或稍后类似的东西,当时我没有受到一个月期限的压力。

我有一个表单,点击Save按钮,通过调用SiteContent.RangeManager.Create(vars)或SiteContent.RangeManager.Update(Range As Range,vars)(或其他管理器类的等价物,无论哪一个碰巧是相关的)。

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

类范围,集合和设计都具有诸如名称,描述,显示和其他几个属性。当创建或更新函数被调用时,管理器循环遍历所有其他项目以检查是否已经存在具有相同名称的项目。 Update函数确保它不会将正在更新的项目与自己进行比较。如果找到另一个具有相同名称的项目,则会引发自定义异常(ItemAlreadyExistsException)。

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

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

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

非常感谢提前。

问候,

理查德·克拉克

编辑:经过大量的时间花在缩小的代码,我已经决定要等到我的兄弟,谁一直是程序员至少8年超过我,复活节回来,让他看看它。如果他不能解决这个问题,那么我会把这些文件压缩起来放在某个地方供人们访问,然后去看看。

我将其缩小到可能的最小文件数,并且仍然存在。这似乎是每隔10次。话虽如此,我强制经理班每刷新10页或5分钟(以较早者为准)。我可能会研究这一点 - 这可能会导致问题。基本上每个管理器都包含一个对象数组。该数组使用数据库中的数据填充。 Update函数获取该项目的一个实例,并为该对象设置新的值。如果碰巧是数组被重置的页面加载(即数据从数据库中新加载),那么具有相同ID的对象实例将不会与传入的实例相同。这解释了它的事实抛出一个ItemAlreadyExistsException现在和然后。这一切都是有道理的,我现在想的就越多。如果我要传入要更改的对象的ID,而不是对象本身,那么它应该完美地工作。我会回答这个问题,如果我解决它..

+2

几乎是不可能没有看到你的代码来诊断。请发布重复此问题的最少量代码。 – womp 2010-03-30 21:10:36

+0

同意,你使用哪种数据库,MySQL?是存储为myisam,innodb等表格。你在表单中使用method =“post”而不是method =“get”...只是为了确保浏览器不会缓存结果... – 2010-03-30 21:16:44

+0

嗯这就是问题 - 它会花费大量的时间来缩小它,因为它全部绑定到数据库和存储过程等等。 我只是试着编辑一个集合,它告诉我一个项目已经存在同名。 CollectionManager中只有一个引发此异常的地方,但其他所有集合都没有相同的名称。我使用的每个集合作为集合在项目中,然后如果String.Compare(__ Collection.Name,Collection.Name,True(IgnoreCase))= 0抛出New ItemExistsException()..我没有看到任何问题。 Regards, Richard – ClarkeyBoy 2010-03-30 21:20:17

回答

0

的更多信息:我已经实现了站点范围内的变化,发现他们没有工作(也许我错过了一个或两个变化或东西..)和撤消更改。然而,我很快就意识到,“数据刷新”机制已经到位,仅仅是因为我们曾经作为两个应用程序在同一个时间点运行同一个数据库进行生活和测试,因为我们希望尽快让网站生活。自从上线日期以来,我花了很多时间来设法将所有测试数据复制到实时数据库,并交换实时站点以使用实时数据库,因此无需再刷新数据。

基本上,因为数据被加载到类的实例中,它们都有效地创建了自己的数据源,直到应用程序被回收。这意味着他们暂时独立运行。测试中有一些功能不是在线测试,有的在测试中没有,所以要对一个需要仅测试和仅实时功能的项目进行一些更改,您必须在测试中进行更改,请等待直播应用程序被回收,然后在现场进行任何必要的更改。这就是为什么我决定创建10页刷新机制的原因 - 为了使数据保持最新状态,现场必须最多刷新10次。它有点复杂,可以解释为什么它们不是两个大致相同,但基本上测试有一个功能齐全但略有毛病的管理前端和一个错误的客户前端,而现场的所有客户前端错误都已修复,几乎没有任何功能在管理员的前端,但是那里没有任何bug,并且还有一些额外的位。事实上,我的笔记本电脑在几个月前被盗了,因此,在没有备份代码的情况下,我必须反编译测试站点并调试反编译的代码,然后才能通过实时站点的功能进一步推进。当我试图反编译测试DLL并赶上实时网站时,客户想要仍然使用测试版本来实现其功能,但希望我优先考虑测试网站中未提供的某些功能 - 因此我们必须让他们都跑掉同一个数据库。我希望这能清除任何人为什么这么复杂会产生混淆。因此,总而言之,我通过完全删除刷新函数找到了解决问题的方法,这主要是由于实时和测试运行在同一数据库上,但具有非常不同的功能和非常不同的数量毛刺。这基本上是由于不得不赶上现场准备好上线日期,同时赶上我的笔记本电脑被盗并且不得不反编译测试站点的DLL。

问候,

理查德

0

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

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

感谢您试图帮助球员。

问候,

理查德