Каков наилучший способ сохранить данные Java-приложения избыточно в файле? - PullRequest
1 голос
/ 23 апреля 2010

Если у меня есть системы, основанные на данных в реальном времени, как я могу гарантировать, что вся текущая информация избыточно сохраняется в файле? Так что, когда программа запускается снова, она использует эту информацию для инициализации обратно туда, где она была при закрытии.

Я знаю xstream и HSQLDB. но не был уверен, что это лучший вариант для данных, которые должны быть буквальной копией.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2010

Создание буквальной копии (то есть снимка) большого объема данных в памяти стоит дорого. Повторение процесса каждый раз, когда вы получаете обновление данных в памяти, вероятно, слишком дорого. Вам нужно переосмыслить архитектуру вашего приложения.

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

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

Третий подход - полностью работать со структурой данных в памяти и работать с постоянством данных следующим образом:

  • периодически вы приостанавливаете обработку обновлений и делаете снимок всей структуры данных в памяти, используя xstream, сериализацию java или любую другую.

  • каждое обновление должно быть надежно записано (с отметкой времени) в файл или файлы в форме, которую можно воспроизвести.

  • при перезапуске приложения вы перезагружаете последний снимок, а затем воспроизводите все обновления, поступившие с моментального снимка.

Последний подход имеет проблему, заключающуюся в том, что существует только одна последняя стабильная копия данных. Если это будет потеряно из-за сбоя жесткого диска или ОС, значит, вы просто тост. В других подходах эту проблему можно решить с помощью базы данных с горячим резервированием, реализованной с использованием стандартной поддержки СУБД для таких вещей.

0 голосов
/ 23 апреля 2010

Все зависит от того, какой тип данных приложения вы храните.Если вам нужно воссоздать Java-объекты в точности так, как они были (т.е. переменные и одно и то же состояние), вы можете сериализовать нужные вам объекты.Существует много механизмов сериализации, например, xstream, как вы упомянули.Если вы храните объекты напрямую, сработал бы один из этих механизмов.

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

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

Нет единственно правильного способа сделать это, нонадеюсь, эти идеи помогут вам начать.

...