2010-03-30 4 views
0

내 웹 사이트에서 응용 프로그램이 SiteContent라는 모듈을 시작하면 "만든"웹 사이트가 있습니다. 이는 이전에 실행 된 함수에서 임의의 데이터가 남아있는 경우 데이터베이스에서 관련이없는 데이터를 기본적으로 삭제하는 정리 기능을 실행합니다."임의로"발생하는 오류

이 모듈에는 Manager 클래스 (즉, RangeManager, CollectionManager, DesignManager)의 인스턴스가 있습니다. 다른 것들도 있지만 이것들을 예제로 사용하겠습니다. 각 Manager 클래스는 항목 배열을 포함합니다. 항목은 Range, Collection 또는 Design 유형 중 하나 여야합니다. 각 범위의 데이터는 Range, Collection 또는 Design의 인스턴스로 읽어들입니다. 이것은 기본적으로 데이터를 복제하는 것입니다. 매우 효율적이지는 않지만 그 순간의 마지막 프로젝트입니다. 그래서 한 달 기한까지 압력을받지 않을 때 언제든지 Linq 또는 유사한 것을 사용하도록 변경할 수 있습니다.

저장 단추를 클릭하면 SiteContent.RangeManager.Create (vars) 또는 SiteContent.RangeManager.Update (Range As Range, vars)를 호출하여 데이터를 저장하는 양식이 있습니다 (또는 다른 관리자 클래스, 우연히 관련이있는 것).

이 함수는 저장 프로 시저를 호출하여 관련 테이블에 삽입하거나 업데이트합니다.

클래스 범위, 컬렉션 및 디자인에는 모두 이름, 설명, 표시 및 기타 여러 속성이 있습니다. 만들기 또는 업데이트 기능이 호출되면 Manager는 다른 모든 항목을 반복하여 동일한 이름의 항목이 이미 있는지 확인합니다. 업데이트 기능은 업데이트되는 항목을 자체와 비교하지 않도록합니다. 같은 이름을 가진 다른 항목이 발견되면 사용자 정의 예외 (ItemAlreadyExistsException)가 발생합니다.

편집 모드에서 범위, 컬렉션 또는 디자인에 들어가서 무언가를 변경하고 업데이트하려고하면 가끔 항목을 업데이트하지 않습니다. 제가 가끔씩 말할 때마다 3 ~ 4 페이지마다로드가 발생하는 경우가 있습니다. 나는 그것이 언제 또는 왜 일어나는지를 전혀 볼 수 없다. 나는 ItemAlreadyExistsException을 잡는 try-catch 문을 가지고 있는데, 잡히면 "이 이름을 가진 항목이 이미있다"라고 출력한다. 때로는 이것을 출력합니다. 그렇지 않으면 그렇지 않을 것이다.

왜 이런 일이 일어날 지 아는 사람이 있습니까? 어쩌면 누군가가 만들어서 전에 풀었던 실수일까요?

이름을 비교 한 정규 표현식을 사용했습니다. 나는 [a-zA-Z] {1, 100} (대소 문자가 1에서 100 사이)라고 생각합니다. 어떤 이유로 인해 사이트를 개발중인 고객이 올바른 형식이 아닌 오류를 표시하는 데 익숙해졌습니다. 그러나 그는 5 분 후에 동일한 문구를 시도 할 수 있었고 괜찮았다. 두 문제가 무작위로 발생하기 때문에 이것이 동일한 문제 일 수 있다고 생각합니다.

미리 감사드립니다.

감사합니다,

리처드 클라크

편집 : 많은 시간이 코드를 축소 보낸 후, 나는 더 나는 것보다 최소 8 년 동안 프로그래머로 활동했으며 내 동생까지 기다리기로 결정했다 , 부활절을 내려 와서 그를 보게하십시오. 그가 그것을 해결할 수 없다면 나는 파일을 압축하여 사람들이 접근하고 갈 수있는 어딘가에 놓을 것입니다.

필자는 말 그대로 파일의 최소 수까지 좁혔지만 여전히 발생합니다. 약 10 번 째되는 것처럼 보입니다. 그런 말로하면 관리자 클래스가 매 10 페이지로드 또는 5 분 (어느 것이 든 더 빠른 시간)마다 새로 고쳐야합니다. 나는 이것을 들여다 볼 수도 있습니다. 이것은 문제를 일으킬 수 있습니다. 기본적으로 각 Manager에는 객체 배열이 포함되어 있습니다.이 배열은 데이터베이스의 데이터를 사용하여 채워집니다. 업데이트 함수는 항목의 인스턴스와 객체에 대해 설정할 새 값을 사용합니다. 배열이 재설정 된 페이지로드 (예 : 데이터가 데이터베이스에서 새로로드 됨) 일 경우 동일한 ID를 가진 객체 인스턴스가 전달되는 인스턴스와 다를 수 있습니다. 이제 ItemAlreadyExistsException을 던집니다. 내가 생각하는 것이 많을수록 지금은 모두 의미가 있습니다. 객체 자체가 아니라 객체의 ID를 전달하면 완벽하게 작동합니다. 나는 그것을 해결하면 질문에 답할 것입니다.

+2

거의 불가능 코드를 보지 않고 진단 할 수 있습니다. 문제를 복제하는 가장 작은 양의 코드를 게시하십시오. – womp

+0

동의합니까, 그리고 어떤 종류의 데이터베이스를 사용하고 있습니까? 테이블은 myisam, innodb 등으로 저장된다. 폼에서 method = "post"를 사용하고 method = "get"이 아닌지 ... 브라우저가 결과를 캐시하지 않도록 ... –

+0

hmm thats 문제 - 그 모든 데이터베이스에 연결 및 절차와 모두 저장으로는 난 그냥 컬렉션을 편집하여 그것을 시도 .. 더 작게 만들기 위해 아마 시간이 걸릴 것이며, 그것은 항목이 이미 같은 이름을 가진 나에게 말했다. 이 예외가 Throw되는 CollectionManager에는 1 개 (살)의 장소가 존재 합니다만, 다른 콜렉션의 이름은 같은 것은 없습니다. 나는 Items 컬렉션에서 Collection으로 사용하고 String.Compare (__ Collection.Name, Collection.Name, True (IgnoreCase)) = 0이면 새로운 ItemExistsException()을 던집니다. 감사 리처드 – ClarkeyBoy

답변

0

더 많은 정보 : 나는 변화가 사이트 전체 구현은 (어쩌면 내가 하나 명 또는 두 개의 변경하거나 뭔가를 실종됐다 ..) 작업하고 변경 사항을 취소 해달라고 발견했다. 그러나 나는 우리가 웹 사이트를 가능한 한 빨리 살아야하기를 원했기 때문에 한 번에 동일한 데이터베이스에서 실행되는 두 개의 응용 프로그램으로 라이브 및 테스트를 수행했기 때문에 "데이터 새로 고침"메커니즘을 갖추 었다는 것을 곧 알게되었습니다. Go-Live 날짜 이후 많은 검토를 거친 후 모든 테스트 데이터를 실제 데이터베이스로 복사하고 실제 사이트를 스왑하여 실제 데이터베이스를 사용하므로 더 이상 데이터를 새로 고칠 필요가 없었습니다.

기본적으로 데이터가 클래스의 인스턴스에로드 되었기 때문에 응용 프로그램이 재활용 될 때까지 효과적으로 둘 다 자체 데이터 소스를 만들었습니다. 이는 일시적으로 독립적으로 실행되고 있음을 의미합니다. 테스트에는 기능이 없었으며 테스트 중에는 살지 않는 일부 기능이 있었기 때문에 테스트 전용 및 라이브 전용 기능이 필요한 항목을 여러 번 변경하여 테스트를 변경해야합니다. 라이브가 끝날 때까지 기다려야합니다. 응용 프로그램을 재활용 한 다음 실제 필요에 따라 변경하십시오. 이것이 10 페이지 새로 고침 메커니즘을 만들기로 결정한 이유였습니다. 따라서 데이터를 최신 상태로 유지하려면 최대한 10 번 새로 고쳐야합니다. 그 둘 모두가 거의 같지 않은 이유를 설명하기에는 약간 복잡하지만, 기본적으로 테스트에는 완전히 기능적이지만 약간 이상한 관리자 프론트 엔드와 버그가있는 고객 프론트 엔드가 있었지만 라이브에는 모든 고객 프론트 엔드 버그가 고정되었고 기능은 거의 없었습니다 관리자 프론트 엔드에서는 버그가 없었던 몇 비트가 있었고 몇 비트가 추가되었습니다. 몇 달 전에 랩톱을 도난 당했기 때문에 코드를 백업하지 않은 채 테스트 사이트를 디 컴파일하고 디 컴파일 된 코드를 디버깅해야 실제 사이트의 기능을 더 발전시킬 수있었습니다. 고객은 테스트 DLL을 역 컴파일하고 실제 사이트를 따라 가려고했지만 테스트 사이트에없는 일부 기능에 우선 순위를 부여하기를 원했던 동안 테스트 버전을 계속 사용하려고했습니다. 우리는 둘 다 동일한 데이터베이스에서 실행해야했습니다. 나는 이것이 누군가가 왜 그렇게 복잡한 지에 대한 혼란을 없애기를 바란다.

요약하면 새로 고침 기능을 완전히 제거하여 문제를 해결할 수있는 방법을 찾았으며 주로 동일한 데이터베이스에서 실행 및 테스트하지만 기능이 매우 다르고 다른 숫자가 매우 많아서 발생했습니다 결함들.이것은 기본적으로 랩톱을 도난당한 채로 테스트 사이트 용 DLL을 디 컴파일해야하는 상황에 대비하여 사이트를 서둘러 준비해야하는 번거 로움 때문에 생겼습니다.

감사합니다,

리처드

0

우후는 제가 문제를 해결 한 것 같습니다. refresh 하위가 page init 이벤트에서 호출되었는데, 버튼 클릭 이벤트가 호출되기 전에 (나는 생각합니다). 따라서 각 관리자의 항목을 다시 만들거나 채 웁니다. 서브 콜을 init에서 loadcomplete로 옮김으로써 문제를 해결할 수 있었다.

고객이 특정 문자열을 넣을 수 없다는 말로 문제를 해결하지 못했고 나중에는 성공적이었습니다. 새로 고침 작업은 최근에 구현 된 것만 큼 다른 문제가되어야합니다. 적어도 하나의 문제는 해결 될 것으로 보인다.

도움을 주셔서 감사합니다.

감사합니다,

리처드