Транзакционный доступ к файловым системам с использованием XADisk

Введение в XADisk

Реализация доступа к файловым системам с использованием транзакций может предложить множество преимуществ для приложений Java™, которые хранят свои данные в файловых системах. Узнайте о том, как использовать продукт с открытым исходным кодом XADisk для обеспечения доступа к файлам с помощью транзакций.

Нитин Верма, специалист в области теории вычислительных машин и систем, IBM

Nitin Verma photoНитин Верма (Nitin Verma) является разработчиком приложений JavaEE в компании Adobe Systems. Ранее он работал в компании Oracle и внес свой вклад в разработку адаптеров JCA для программного пакета Oracle SOA Suite. Заинтересовался XADisk из-за увлечения JCA и XA. Нитин окончил Индийский Институт информационных технологий по специальности «Информатика и вычислительная техника».



08.10.2012

Введение

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

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

В данной статье рассматривается комплексная транзакционная система с открытым исходным кодом XADisk, которая обеспечивает возможность транзакционного доступа к файловым системам из приложений Java и JavaEE. С помощью нескольких простых API вы можете развернуть XADisk поверх любой JVM без необходимости установки на ОС. После развертывания приложения будут вызывать API XADisk для выполнения различных операций ввода-вывода с файлами в рамках транзакций.

XADisk предоставляет множество других возможностей, например транзакции XA, полное соответствие требованиям архитектуры JCA, входящие сообщения и прочее. Описание данных возможностей выходит за рамки настоящей статьи, которая носит вводный характер.


Основы XADisk

XADisk можно рассматривать как промежуточный уровень между приложениями и файловыми системами. Сам по себе продукт XADisk не является реализацией файловой системы; он может работать с самыми разнообразными файловыми системами (например, NTFS, FAT, ext3), обеспечивая возможность транзакционного доступа приложений к этим файловым системам. Приложения вызывают API XADisk для выполнения различных операций ввода-вывода и могут применять команды commit (фиксация) или rollback (откат) для всех этих операций в рамках единой транзакции.

Система XADisk написана на языке Java и работает на платформе Java версии 5.0 или старше. Продукт может использоваться Java-приложениями всех видов, Web-приложениями, работающими на серверах Java (например, Apache Tomcat), а также приложениями JavaEE, работающими на серверах JavaEE, и т. д.

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

XADisk поддерживает широкий спектр операций с файлами/каталогами:

  • Файлы — create (создание), delete (удаление), move (перемещение), copy (копирование), truncate (усечение), read (чтение), write (запись), exists (существует), getLength (возврат длины)
  • Каталоги — create (создание), delete (удаление), move (перемещение), list children (список потомков), exists (существует)

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

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


Использование XADisk

Процесс начальной загрузки

Прежде чем вызывать операции ввода-вывода через XADisk, загрузите экземпляр XADisk на виртуальной машине Java (JVM). На одной и той же JVM могут существовать несколько экземпляров XADisk; при этом каждый экземпляр XADisk будет иметь свое собственное изолированное состояние. В данной статье показано, как загрузить и вызвать один такой экземпляр XADisk.

Поскольку загрузить XADisk можно на любой JVM, его можно использовать в самых разнообразных средах Java от простых Java-программ до серверов JavaEE (таких как JBoss) и Web-серверов (таких как Tomcat).

Для загрузки экземпляра XADisk в вашей системной среде должны быть доступны следующие компоненты:

  1. Java версии 5.0 или старше
  2. XADisk.jar (можно загрузить с сайта http://xadisk.java.net/)
  3. Jar-файл JCA 1.5 (можно загрузить с сайта http://download.java.net/maven/1/javax.resource/jars/connector-api-1.5.jar)

Во время начальной загрузки XADisk принимает объект конфигурации для своих различных параметров конфигурации. Большинство значений параметров конфигурации установлены по умолчанию. Обязательными являются только SystemDirectory и InstanceId. Как показано в листинге 1, конструктор конфигураций принимает два этих параметра конфигурации. SystemDirectory— это каталог, в котором XADisk хранит все свои артефакты (например, журналы транзакций), необходимые для работы. InstanceId— уникальный идентификатор экземпляра XADisk в пределах JVM.

Листинг 1. Конфигурирование и инициализация экземпляра XADisk
String XADiskSystemDirectory =“/home/systems/XADiskSystem1";
StandaloneFileSystemConfiguration configuration = 
    new StandaloneFileSystemConfiguration(XADiskSystemDirectory, “instance-1”);
XAFileSystem xaf = XAFileSystemProxy.bootNativeXAFileSystem(configuration);
xaf.waitForBootup(10000L);

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

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

  1. Во время начальной загрузки, как показано в листинге 1.
  2. С помощью instanceId из любого места в JVM, как показано в листинге 2.
Листинг 2. Получение ссылки XAFileSystem для экземпляра XADisk на той же JVM.
XAFileSystem xaf = XAFileSystemProxy.getNativeXAFileSystemReference(“instance-1”);
  1. Удаленными приложениями, как показано в листинге 3.
Листинг 3. Получение ссылки XAFileSystem для экземпляра XADisk с удаленной JVM.
XAFileSystem xaf = XAFileSystemProxy.getRemoteXAFileSystemReference("10.30.9.200", 5151);
/*параметрами являются параметры конфигурации serverAddress и serverPort, 
используемые во время начальной загрузки удаленного экземпляра XADisk. 
Обратите внимание на то, что дистанционное взаимодействие с 
экземпляром XADisk по умолчанию деактивировано, но может быть активировано 
с помощью configuration.setEnableRemoteInvocations(true) во время начальной загрузки
*/

Вызов операций ввода-вывода

Теперь, когда экземпляр XADisk готов к работе, можно начинать выполнение транзакционных операций с файлами/каталогами.

После получения ссылки XAFileSystem метод вызова API XADisk остается таким же, независимо от того, где работает целевой экземпляр XADisk: на той же JVM или на удаленной JVM.

Поскольку операции с файлами/каталогами будут производиться внутри транзакции, сначала инициируйте транзакцию путем создания сеанса Session, как показано в листинге 4.

Листинг 4. Создание сеанса и инициализация транзакции
Session session = xaf.createSessionForLocalTransaction();

После установки сеанса можно приступать к выполнению необходимых операций ввода-вывода. API XADisk для операций с файлами/каталогами отличаются простотой. Некоторые примеры приведены в листинге 5.

Листинг 5. Вызов API XADisk для операций с файлами/каталогами
File f = new File("/testAPIs/test.txt");
if(session.fileExists(f)) {
    XAFileInputStream xis = session.createXAFileInputStream(f);
    for (int i = 0; i < 100; i++) {
        byte a = (byte) xis.read();
        if( a== -1) {
            break;
        }
        System.out.print(a);
     }
    xis.close();
    session.moveFile(f, new File("/testAPIs/test.txt___” + System.currentTimeMillis()));
}
else {
    //ниже используйте false для создания файла, true для создания каталога
    session.createFile(f, false);
     //ниже используйте false для очень маленьких операций записи, в противном случае true
     XAFileOutputStream xafos = session.createXAFileOutputStream(f, false);
     byte[] buffer = new byte[100];
     for (int i = 0; i < 100; i++) {
        buffer[i] = i*i;
     }
     xafos.write(buffer);
     xafos.close();
}
/* Вы можете выполнить здесь больше операций путем вызова Session API 
для чтения/записи/создания/удаления/обновления/копирования/перемещения файлов 
и каталогов. Более подробную информацию см. в документе JavaDoc XADisk для 
интерфейса с именем XADiskBasicIOOperations.*/

После завершения всех операций ввода-вывода мы можем выполнить фиксацию (или откат) транзакции с помощью простого вызова сеансового объекта, как показано в листинге 6.

Листинг 6. Фиксация или откат транзакции, связанной с сеансом
//фиксация транзакции
session.commit();
//или откат транзакции
session.rollback();

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

Завершение работы

Работу экземпляра XADisk можно завершить из любого места в JVM, как показано в листинге 7.

Листинг 7. Завершение работы экземпляра XADisk из той же JVM
XAFileSystem xaf = XAFileSystemProxy.getNativeXAFileSystemReference(“instance-1”);
xaf.shutdown();

Заключение

Реализация доступа к файловым системам с использованием транзакций может предложить множество преимуществ для приложений, которые хранят свои данные в файловых системах. XADisk представляет собой бесплатное решение с открытым исходным кодом, которое позволяет приложениям взаимодействовать с файловыми системами при помощи транзакций. Данный продукт предоставляет простые API для инициализации, выполнения различных операций с файлами/каталогами и управления транзакциями.

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

Ресурсы

Научиться

Получить продукты и технологии

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

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



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

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Технология Java
ArticleID=839475
ArticleTitle=Транзакционный доступ к файловым системам с использованием XADisk
publish-date=10082012