Восстановление базы данных после ручного изменения - PullRequest
1 голос
/ 16 октября 2008

Проблема решена: Спасибо, ребята, смотрите мой ответ ниже.

У меня есть веб-сайт, работающий в Tomcat 5.5, подключенный к базе данных MySQL5 с помощью Hibernate3.

Одна запись просто отказывается сохранять какие-либо изменения в ней. Если я изменю запись программным путем, значения вернутся к тому, что были ранее.

Если я вручную изменю запись в базе данных, значения вернутся (по-видимому, как только веб-приложение получит к ним доступ).

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

Я также попытался удалить рабочую папку Tomcat для веб-приложения и файл кэша .ser.

Я также проверил код на значения, к которым возвращаются, и не могу их найти.

Я заметил это только на этой конкретной записи.

Редактировать: Я только что посмотрел на вывод SQL из Hibernate, используя hibernate.show_sql = true. Для таблицы, в которой находится моя строка, зарегистрирован запрос на обновление. Кто-нибудь знает, как разрешить? для столбцов к фактическим значениям?

Ответы [ 6 ]

1 голос
/ 16 октября 2008

Чтобы ответить на ваш вопрос:

Кто-нибудь знает, как решить? для столбцов к фактическим значениям?

Вы можете сделать это с помощью p6spy . Инструкции по настройке этого в приложении Spring доступны здесь .

Однако, я думаю, что в этих инструкциях есть ошибка, файл, который они называют p6spy.log, на самом деле должен называться p6spy.properties.

1 голос
/ 16 октября 2008

Вы можете временно включить ведение журнала запросов mysql и посмотреть, какой именно оператор sql изменил значение. Поскольку вы говорите, что он меняется сразу после запуска сервера, вы сможете довольно быстро выяснить это утверждение.

http://dev.mysql.com/doc/refman/5.0/en/query-log.html

0 голосов
/ 17 октября 2008

Спасибо всем за помощь. Все предложения пригодились для его отслеживания.

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

Время взглянуть на некоторую нормализацию.

0 голосов
/ 16 октября 2008

Добавьте триггер ДО ОБНОВЛЕНИЯ, проверьте идентификатор строки, вызовите ошибку SQL, если она соответствует вашей волшебной строке. Затем проверьте сгенерированную трассировку стека, пройдитесь по коду и найдите фрагмент, который обновляет строку.

0 голосов
/ 16 октября 2008

Это немного похоже на запуск тестового примера при запуске, который изменяет строку до того, что он ожидает до тестирования.

0 голосов
/ 16 октября 2008

Это приближается к Хэллоуину, так что вы должны ожидать такого рода вещи (плюс это была просто полная луна), но я бы продолжал искать виновника в веб-приложении ... оно должно быть там. Пара значений, которые я бы сразу искал в исходном коде веб-приложения:

  • Идентификатор изменяемой записи.
  • Значение, которое записывается в запись.

Удачи ... это могут быть настоящие медведи!

...