2010-03-30 122 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,我設法解決了這個問題。

它仍然不能解決客戶被告知他無法放置特定字符串,然後一段時間後成功的問題..必須是一個不同的問題,因爲刷新的東西最近才實現。但至少有一個問題似乎得到解決。

感謝您試圖幫助球員。

問候,

理查德