Многофайловое Хранение Объектов Java В Формате Xml

Многофайловое хранилище Java-объектов в формате xml (часть 2)



Введение

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

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

В очередной раз мне пришлось столкнуться с подобной ситуацией.

Задача была сохранить объекты в файле формата xml. Ничто не казалось бы сложным, если бы не несколько «но».

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

Как вы понимаете, постоянное написание и чтение большого xml-файла — достаточно трудоемкая задача.

Особенно если с одними и теми же данными работают несколько потоков.

Так родилась идея написать многофайловое объектное хранилище в формате xml. В этой статье я не буду рассматривать саму реализацию.

Я приведу только основные идеи и способы использования данной реализации.

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

Исходники доступны по ссылке: xdstore-1.3 Исходные тексты несколько отличаются от приведенных в этой статье.

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

Также в последней версии реализована фрагментация.



Основная идея разработки

Основная идея — хранить объекты не в одном файле, а в некотором наборе.

При этом предоставьте возможность настройки политик хранения для каждого необходимого класса.

Для класса можно установить одну из следующих политик:

  • РодительскийОбъектФайл – объекты класса будут сохранены в объектном файле владельца как дочерние, эта политика применяется по умолчанию;
  • ОдиночныйОбъектФайл — каждому объекту класса предоставляется отдельный файл, и в объектном файле-владельце будет храниться только ссылка на этот объект (в дальнейшем я буду называть ее просто ссылкой на объект); все файлы каждого объекта будут сохранены в отдельной папке внутри хранилища;
  • КлассОбъектыФайл – все объекты этого класса будут храниться в отдельном файле, а в объектных файлах-владельцах будут сохраняться только ссылки на объекты.

Под понятием объектная ссылка понимается объект заданного класса, имеющий одно поле – идентификатор.

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

Загрузка таких объектов аналогична поздней инициализации в спящем режиме.

Сохраняемые объекты должны быть реализованы как JavaBeans с методами get(is) и set для сохраняемых полей.



Одно интересное задание

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

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

Нас интересует поведение в такой ситуации, т.е.

что будет с данными в каждой транзакции.

В текущей реализации библиотеки поведение будет следующим: 1) Поскольку данные были изменены первой транзакцией, второй транзакции будет отказано в изменении данных в виде исключения.

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

2) Но данные третьей транзакции будут приняты, так как она началась после коммита первой транзакции и работает с обновленными данными.

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

В этом случае генерируется исключение и транзакцию необходимо откатить.



Начиная

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

Основным требованием для каждого хранимого объекта является реализация простого интерфейса IXmlDataStoreIdentifying. Это выглядит так:

   

public interface IXmlDataStoreIdentifiable {

Теги: #xml-хранилище java #xml-хранилище java-объектов #xml-хранилище java-объектов #xdstore #xdstore #хранилище нескольких файлов #программирование #java #xml
Вместе с данным постом часто просматривают: