综合事务系统:XADisk
XADisk 是一个开源的综合事务系统,支持从 Java 和 JavaEE 应用程序对文件系统进行事务性访问。使用一些简单的 API,您可以将 XADisk 部署在任何 JVM 上,无需在操作系统上执行任何安装。部署之后,应用程序就会调用 XADisk API 在事务内执行各种各样的文件 IO 操作。
XADisk 还提供了其他许多功能,比如 XA 事务、完全的 JCA 合规性、入站消息等。这些功能不属于这篇简介文章的介绍范围。
可将 XADisk 视为应用程序与文件系统之间的一个层。XADisk 本身不是一种文件系统实现;它可用于各种各样的文件系统(比如 NTFS、FAT、ext3),并且支持应用程序对这些文件系统执行事务性访问。应用程序可调用 XADisk API 来执行各种 I/O 操作,以单个事务的形式提交或回滚所有这些操作。
XADisk 是使用 Java 编写的,在 Java 5 或其更高版本上运行。它可供所有类型的 Java 应用程序、在 Java 服务器中运行的 Web 应用程序(比如 Apache Tomcat)和在 JavaEE 服务器中运行 JavaEE 应用程序等使用。
作为 XADisk 用途的一个简单示例,可以考虑一个 Java 应用程序。这个应用程序希望创建一个名为 F1 的新文件,从另一个名为 F2 的文件向它写入一些数据,然后删除 F2。这 3 个操作可使用 XADisk 在单个事务内执行,并具有前面提及的 ACID 属性的典型迹象。即使应用程序在中途崩溃,XADisk 也会维护这些迹象。
XADisk 支持对文件/目录执行多种不同的操作:
-
文件 — 创建、删除、移动、复制、截断、读取、写入、存在、getLength
-
目录 — 创建、删除、移动、列出子目录、存在
当使用 XADisk 时,应用程序和目标文件系统需要在同一个机器上。应用程序可采用与部署在相同 JVM 上的 XADisk 相同的方式远程调用 XADisk API。
详细介绍文章:http://www.ibm.com/developerworks/cn/opensource/os-xadisk/index.html
简单示例:
import java.io.File; import java.io.IOException; import org.xadisk.bridge.proxies.interfaces.Session; import org.xadisk.bridge.proxies.interfaces.XAFileSystem; import org.xadisk.bridge.proxies.interfaces.XAFileSystemProxy; import org.xadisk.filesystem.exceptions.XAApplicationException; import org.xadisk.filesystem.standalone.StandaloneFileSystemConfiguration; public class XADiskHelloWorld { public static void main(String args[]) { String xadiskSystemDirectory = "C:\\xadisk"; File sampleDataDir1 = new File("C:\\data1"); XAFileSystem xafs = null; try { StandaloneFileSystemConfiguration configuration = new StandaloneFileSystemConfiguration(xadiskSystemDirectory, "id-1"); xafs = XAFileSystemProxy.bootNativeXAFileSystem(configuration); System.out.println("\nBooting XADisk...\n"); xafs.waitForBootup(-1); System.out.println("\nXADisk is now available for use.\n"); Session session = xafs.createSessionForLocalTransaction(); try { session.createFile(sampleDataDir1, true); session.createFile(new File(sampleDataDir1, "a.txt"), false); session.commit(); System.out.println("\nCongratulations! You have successfully run the XADisk-Hello-World.\n"); } catch (XAApplicationException xaae) { session.rollback(); throw xaae; } } catch (Throwable t) { t.printStackTrace(); } finally { if (xafs != null) { try { xafs.shutdown(); } catch (IOException ioe) { ioe.printStackTrace(); } } } } }