У меня возникла разочаровывающая проблема со статическими переменными в приложении, которое я отлаживаю (я сам не сам его кодировал).Статическая переменная Java неожиданно сохраняется
У меня есть таблица базы данных mysql, называемая Transits. Транзиты имеют строковый столбец (varchar), который содержит дату (eventdt) формата «yyyy/MM/dd HH: mm: ss».
В моем соответствующем классе hibernate у меня есть переменная Date, которая будет хранить значение eventdt. Таким образом, когда eventdt читается, код преобразует его из строки в Date.
В коде используется SimpleDateFormat для преобразования. Программист использовал статический переменный для хранения формата, но, к сожалению, сделал ошибку форматирования:
private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
Оставив его как есть, каждая дата хранится в столбце eventdt, который находится на полдень часов сохраняется в соответствующей переменной Date как полночь. Очевидно, что это нежелательно, поэтому я попытался это исправить:
private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Однако код продолжает сохранять прежний формат «ГГГГ/ММ/ДД чч: мм: сс».
Я прочитал статические переменные и сделал все, что мог, чтобы очистить его. Я перекомпилировал код, затем перераспределил (на Glassfish 3.1.1). Я перезапустил Netbeans (7.1.1), а затем снова восстановил/повторно развернул. Я очистил тайники Netbeans и повторил тот же процесс. Затем я удалил всю установку Glassfish, перезагрузил, воссоздал домены, снова очистил кеш и прошел ту же перестройку/передислокацию.
Я также попытался изменить сам код. Я подумал, что это может быть проблемой нарезания резьбы, поэтому я изменил переменную статику окончательным:
private static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Тогда я изменил его так, что статический окончательные переменная строка формата, и экземпляр объекта DateFormat в каждом методе где это было необходимо:
// In class variable block
private static final String DATETIME_FORMAT_PATTERN = "yyyy/MM/dd HH:mm:ss";
// In class methods
DateFormat df = new SimpleDateFormat(DATETIME_FORMAT_PATTERN);
Независимо от того, что я сделал, тот же ошибочный формат «дд/мм/гггг чч: мм: сс» сохраняется.
Единственное, что я могу думать о том, что я еще не сделал, - удалить и переустановить Netbeans. Я где-то читал, что обновление тоже помогло. Нужно ли мне зайти так далеко, чтобы очистить старую переменную?
я не пытался ставить код в синхронизированный блок или его инициализации THREADSAFE (хотя я даже не уверен, потоковая это вопрос здесь ...)
Я был бы признателен за любые указания, в правом направлении, поскольку у меня заканчиваются идеи. Благодаря!
Редактировать: В соответствии с запросом здесь используется код, который использует DateFormat. lpr - еще один объект Hibernate, объединяющий таблицу Transits и некоторые другие необходимые таблицы.
Date activityDate = null;
try {
activityDate = df.parse(getEventdt());
lpr.setActivityDateTime(activityDate);
} catch (Exception e) {
logger.warn("Unable to parse " + getEventdt() + " as a date.");
}
Я также должен добавить, что я попытался найти весь исходный код для другого места, где может быть установлен DateFormat, но не нашел ни одного другого случая ошибочного формата. Помощь будет очень признательна! –
Как вы проверили, что «* код продолжает сохранять предыдущий формат» yyyy/MM/dd hh: mm: ss «*»? SimpleDateFormat ** не является потокобезопасным [см. Этот пост, например] (http://stackoverflow.com/questions/6840803/simpledateformat-thread-safety). – assylias
Это принципиально невозможно, что NetBeans - это проблема, которая даже не имеет смысла. Также имейте в виду, что 'SDF' не являются потокобезопасными, хотя это зависит от приложения, если это важно - это не связано с проблемой, которую вы видите. –