XADisk綜合事務(wù)系統(tǒng)
XADisk 是一個(gè)開(kāi)源的綜合事務(wù)系統(tǒng),支持從 Java 和 JavaEE 應(yīng)用程序?qū)ξ募到y(tǒng)進(jìn)行事務(wù)性訪問(wèn)。使用一些簡(jiǎn)單的 API,您可以將 XADisk 部署在任何 JVM 上,無(wú)需在操作系統(tǒng)上執(zhí)行任何安裝。部署之后,應(yīng)用程序就會(huì)調(diào)用 XADisk API 在事務(wù)內(nèi)執(zhí)行各種各樣的文件 IO 操作。
XADisk 還提供了其他許多功能,比如 XA 事務(wù)、完全的 JCA 合規(guī)性、入站消息等。這些功能不屬于這篇簡(jiǎn)介文章的介紹范圍。
可將 XADisk 視為應(yīng)用程序與文件系統(tǒng)之間的一個(gè)層。XADisk 本身不是一種文件系統(tǒng)實(shí)現(xiàn);它可用于各種各樣的文件系統(tǒng)(比如 NTFS、FAT、ext3),并且支持應(yīng)用程序?qū)@些文件系統(tǒng)執(zhí)行事務(wù)性訪問(wèn)。應(yīng)用程序可調(diào)用 XADisk API 來(lái)執(zhí)行各種 I/O 操作,以單個(gè)事務(wù)的形式提交或回滾所有這些操作。
XADisk 是使用 Java 編寫的,在 Java 5 或其更高版本上運(yùn)行。它可供所有類型的 Java 應(yīng)用程序、在 Java 服務(wù)器中運(yùn)行的 Web 應(yīng)用程序(比如 Apache Tomcat)和在 JavaEE 服務(wù)器中運(yùn)行 JavaEE 應(yīng)用程序等使用。
作為 XADisk 用途的一個(gè)簡(jiǎn)單示例,可以考慮一個(gè) Java 應(yīng)用程序。這個(gè)應(yīng)用程序希望創(chuàng)建一個(gè)名為 F1 的新文件,從另一個(gè)名為 F2 的文件向它寫入一些數(shù)據(jù),然后刪除 F2。這 3 個(gè)操作可使用 XADisk 在單個(gè)事務(wù)內(nèi)執(zhí)行,并具有前面提及的 ACID 屬性的典型跡象。即使應(yīng)用程序在中途崩潰,XADisk 也會(huì)維護(hù)這些跡象。
XADisk 支持對(duì)文件/目錄執(zhí)行多種不同的操作:
文件 — 創(chuàng)建、刪除、移動(dòng)、復(fù)制、截?cái)?、讀取、寫入、存在、getLength
目錄 — 創(chuàng)建、刪除、移動(dòng)、列出子目錄、存在
當(dāng)使用 XADisk 時(shí),應(yīng)用程序和目標(biāo)文件系統(tǒng)需要在同一個(gè)機(jī)器上。應(yīng)用程序可采用與部署在相同 JVM 上的 XADisk 相同的方式遠(yuǎn)程調(diào)用 XADisk API。
詳細(xì)介紹文章:http://www.ibm.com/developerworks/cn/opensource/os-xadisk/index.html
簡(jiǎn)單示例:
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();
}
}
}
}
}