«Случайно» возникающие ошибки - PullRequest
0 голосов
/ 31 марта 2010

У моего веб-сайта есть настройка, при которой при запуске приложения «SiteContent» «создается». При этом запускается функция очистки, которая в основном удаляет все ненужные данные из базы данных, в случае если они были оставлены там от ранее запущенных функций.

Модуль имеет экземпляры классов Manager, а именно 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 и некоторые другие. При вызове функции «Создать или обновить» диспетчер просматривает все остальные элементы, чтобы проверить, существует ли уже элемент с таким именем. Функция Update гарантирует, что она не сравнивает обновляемый элемент с самим собой. Настраиваемое исключение (ItemAlreadyExistsException) выдается, если найден другой элемент с тем же именем.

По какой-то странной причине, если я захожу в Range, Collection или Design в режиме редактирования, изменяю что-то и пытаюсь обновить его, он иногда не обновляет элемент. Когда я говорю иногда, я имею в виду каждые 3-4 страницы, иногда больше. Я не вижу абсолютно никакой картины в том, когда или почему это происходит. У меня есть оператор try-catch, который перехватывает ItemAlreadyExistsException и выдает «Элемент с таким именем уже существует» при перехвате. Иногда это будет выводить это; в других случаях это не так.

Кто-нибудь знает, почему это может произойти? Может быть, ошибка, которую кто-то сделал и решил раньше?

Раньше у меня были регулярные выражения, с которыми сравнивались имена - я думаю, что это было [a-zA-Z] {1, 100} (от 1 до 100 символов в нижнем или верхнем регистре). По какой-то причине клиент, для которого я разрабатываю сайт, использовал ошибки, сообщающие, что он не в правильном формате. Тем не менее он мог попробовать тот же текст 5 минут спустя, и он будет работать нормально. Я думаю, что это вполне может быть одной и той же проблемой, поскольку обе проблемы возникают случайным образом.

Большое спасибо заранее.

С уважением,

Ричард Кларк

Edit: После долгого времени, потраченного на сужение кода, я решил подождать, пока мой брат, который был программистом по крайней мере на 8 лет больше, чем я, приедет на Пасху и заставит его взглянуть на него. Если он не может решить эту проблему, тогда я заархивирую файлы и положу их куда-нибудь, чтобы люди могли получить к ним доступ.

Я сузил его буквально до минимально возможного количества файлов, и это все еще происходит. Кажется, примерно каждый десятый раз. Сказав это, я заставляю классы менеджера обновляться каждые 10 загрузок страницы или 5 минут (в зависимости от того, что наступит раньше). Я могу посмотреть на это - это может вызвать проблемы. В основном каждый менеджер содержит массив объекта. Этот массив заполняется с использованием данных из базы данных. Функция Update берет экземпляр элемента и новые значения, которые должны быть установлены для объекта. Если это происходит при загрузке страницы, когда массив сбрасывается (т. Е. Данные загружаются заново из базы данных), то экземпляр объекта с тем же идентификатором не будет тем же, что и передаваемый. Это объясняет тот факт, что время от времени создает исключение ItemAlreadyExistsException. Теперь все имеет смысл, чем больше я об этом думаю. Если бы я передал идентификатор объекта, который нужно изменить, а не сам объект, то он должен работать идеально. Я отвечу на вопрос, если я его решу ..

Ответы [ 2 ]

0 голосов
/ 31 марта 2010

Дополнительная информация: я применил изменения по всему сайту, обнаружил, что они не работают (возможно, я пропустил одно или два изменения или что-то в этом роде ...) и отменил изменения. Однако вскоре я понял, что механизм «обновления данных» был введен в действие просто потому, что мы работали и тестировали как два приложения, работающие с одной и той же базой данных в одной точке, так как мы хотели как можно быстрее запустить веб-сайт. После долгих хлопот со времени ввода в действие мне удалось скопировать все тестовые данные в оперативную базу данных и поменять местами действующий сайт, чтобы использовать оперативную базу данных, поэтому больше не было необходимости обновлять данные.

По сути, поскольку данные загружались в экземпляры классов, они оба эффективно создавали свои собственные источники данных до тех пор, пока приложение не было переработано. Это означало, что они временно работали самостоятельно. В тесте были некоторые функции, которых не было вживую, а некоторые в режиме реального времени, которые не были в тесте, поэтому для внесения нескольких изменений в один элемент, требующий функциональности только для тестирования и только в режиме реального времени, необходимо внести изменения в тест, подождать до начала приложение переработано, затем внесите необходимые изменения в живую. Вот почему я решил создать 10-страничный механизм обновления - так чтобы в реальном времени данные обновлялись не более 10 раз. Немного сложно объяснить, почему они не были примерно одинаковыми, но в основном тестирование имело полнофункциональный, но слегка сбойный интерфейс администратора и глючный клиентский интерфейс, в то время как в режиме реального времени были исправлены все ошибки клиентского интерфейса и практически отсутствовала какая-либо функциональность. в интерфейсе администратора, но несколько битов, которые были там, были свободны от ошибок, и там было также добавлено несколько дополнительных битов. Тот факт, что мой ноутбук был украден пару месяцев назад, поэтому, не создав резервное копирование кода, мне пришлось декомпилировать тестовый сайт и отладить декомпилированный код, прежде чем я смог продвинуться дальше с помощью функциональности для живого сайта. Заказчик хотел по-прежнему использовать тестовую версию для функциональности, которая была у него, пока я пытался декомпилировать тестовую DLL и наверстать упущенное для живого сайта, но хотел, чтобы я расставил приоритеты по некоторым функциям, которых нет на тестовом сайте - следовательно нам нужно было, чтобы они оба работали из одной базы данных. Я надеюсь, что это устранит любую путаницу, с которой кто-то мог столкнуться, почему это так сложно.

Итак, чтобы подвести итог, я нашел способ обойти проблему, полностью удалив функцию обновления, и это было вызвано, в первую очередь, тем, что работали и тестировали, запуская одну и ту же базу данных, но с очень разным количеством функциональных возможностей и очень различным количеством сбоев. , В основном это было вызвано необходимостью спешить подготовить сайт к дате начала работы, а после того, как у меня украли ноутбук, и пришлось декомпилировать DLL для тестового сайта.

С уважением,

Richard

0 голосов
/ 31 марта 2010

Woohoo, кажется, я решил проблему. Обновление sub вызывалось в событии init страницы, прежде чем (я думаю) вызывалось событие нажатия кнопки. Поэтому пункты каждого менеджера были воссозданы / заполнены. Перемещая дополнительный вызов из init в loadcomplete, мне удалось решить проблему, кажется.

Это по-прежнему не решает проблему, с которой сталкивался клиент, когда ему говорили, что он не может поместить определенную строку, а затем она будет успешной через некоторое время ... должна быть другая проблема, поскольку функция обновления была реализована только недавно ... По крайней мере, одна проблема, кажется, решена.

Спасибо за попытку помочь парням.

С уважением,

Richard

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...