Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTA的实际交付价值是多少?_Java_Jta_Bitronix - Fatal编程技术网

Java JTA的实际交付价值是多少?

Java JTA的实际交付价值是多少?,java,jta,bitronix,Java,Jta,Bitronix,我试图了解Java事务API(JTA)及其实现之一Bitronix下面的价值。但当我越来越深入地阅读文档时,我不禁想到以下简单的例子: public interface Transactional { public void commit(Object); public void rollback(); } public class TransactionalFileWriter extends FileWriter implements Transactional {

我试图了解Java事务API(JTA)及其实现之一Bitronix下面的价值。但当我越来越深入地阅读文档时,我不禁想到以下简单的例子:

public interface Transactional {
    public void commit(Object);
    public void rollback();
}

public class TransactionalFileWriter extends FileWriter implements Transactional {
    @Override
    public void commit(Object obj) {
        String str = (String)obj;

        // Write the String to a file.
        write(str);
    }

    @Override
    public void rollback() {
        // Obtain a handler to the File we are writing to, and delete the file.
        // This returns the file system to the state it was in before we created a file and started writing to it.
        File f = getFile();

        // This is just pseudo-code for the sake of this example.
        File.delete(f);
    }
}

// Some method in a class somewhere...
public void doSomething(File someFile) {
    TransactionalFileWriter txFileWriter = getTxFW(someFile);
    try {
        txFileWriter.commit("Create the file and write this message to it.");
    } catch(Throwable t) {
        txFileWriter.rollback();
    }
}
不要过于沉迷于上面的实际代码。这个想法很简单:一个事务性文件编写器,创建一个文件并写入其中。它的
rollback()
方法删除文件,从而使文件系统恢复到
commit(Object)
之前的状态


我是不是遗漏了什么?这就是JTA提供的所有服务吗?或者,是否有一整套不同的维度/交易性方面没有用我上面的简单示例来表示?我猜是后者,但尚未在JTA文件中看到任何具体内容。如果我遗漏了什么,那是什么?有人能给我具体的例子吗?我可以看到事务性是JDBC的一个巨大组件,但我希望得到一个JTA的例子,它可以与数据库以外的其他东西一起使用。

JTA最大的特点是,您可以在一个应用程序中组合多个事务存储,并跨这些独立存储运行事务

例如,您可以拥有一个DB、一个分布式事务键值存储和一个简单的FileWriter,并拥有一个对所有这些执行操作的事务,同时提交所有存储中的所有更改

看一看。这是一个事务性数据网格,它使用JTA,可以与其他JTA事务性服务结合使用

编辑:

基本上,JTA连接到标准,它提供了直接在Java代码中与X/OpenXA资源交互的方法。您可以使用alredy现有的数据存储,这些数据存储包含X/OpenXA兼容的资源,如数据库、分布式数据网格等。或者,您可以通过实现来定义自己的资源。然后,当您使用这些资源时,事务管理器将为您安排一切,无论资源位于何处,数据存储在何处

整个业务由事务管理器管理,事务管理器负责同步独立的数据存储。JTA没有事务管理器。JTA只是一个API。如果愿意,您可以自己编写(),但显然这是一项困难的任务。相反,您希望使用一些已经实现的JTA服务/库,它具有事务管理器。例如,如果在应用程序中使用infinispan,则可以使用其事务管理器来允许事务与不同的数据存储交互。最好向JTA接口的实现者寻求关于如何实现这一点的更多信息

您可以找到完整的JTAAPI文档,尽管它相当长。也有一些讨论如何使用JavaEE事务管理器和更新多个数据存储的文章,但是它非常模糊,并且没有提供任何代码示例

您可以查看Infinispan的文档和教程,但我看不到任何将Infinispan与其他数据存储相结合的示例

编辑2:

从评论中回答你的问题:你的理解或多或少是正确的,但我会尝试进一步澄清

用图片解释架构和回答您的问题会更容易。以下内容摘自JTA规范1.1

这是X/Open XA体系结构:

每个数据存储(数据库、消息队列、SAP ERP系统等)都有自己的资源管理器。对于关系数据库,JDBC驱动程序是一个资源适配器,用Java表示数据库的资源管理器。每个资源都必须通过XAResource接口可用(这样事务管理器即使不知道特定数据存储的实现细节也可以管理它们)

应用程序通过资源适配器与资源管理器(以访问特定资源)以及通过UserTransaction接口与事务管理器(以启动/完成事务)通信。每个资源管理器都需要首先初始化,并且必须针对全局事务进行配置(即跨越多个数据存储)

因此,基本上,是的,数据存储是独立的逻辑单元,对一些资源进行分组。它们还展示了允许执行本地事务的接口(仅限于特定的数据存储)。该接口的性能可能更好,或者可能会公开特定于该数据存储的一些附加功能,这些功能无法通过JTA接口使用

这是JTA环境的体系结构:

小半圆代表JTA接口。在您的例子中,您最感兴趣的是JTA UserTransaction接口。您还可以使用EJB(事务bean),应用服务器将为您管理事务,但这是另一种方式

从事务管理器的角度来看 交易服务不需要公开;只需要创建高级接口 定义为允许事务划分、资源登记、同步和 由事务服务用户驱动的恢复过程

因此,可以将事务管理器理解为一个接口,它只表示用于管理事务的实际机制,如JTS实现,但将其作为一个整体考虑也不是一个错误


据我所知,如果您运行例如JBoss应用服务器,您已经配备了具有底层事务服务实现的事务管理器。

正如其他人所提到的,JTA的主要好处不是单个事务案例,而是多个事务的协调
String pathName = saveUploadedFile(myFile);
saveMetaData(myFile.size(), myFile.type(), currentUser, pathName);
queueMessageToJMS(new FileArrivalEvent(user, pathName);
beginWork();
try {
    String pathName = saveUploadedFile(myFile);
    saveMetaData(myFile.size(), myFile.type(), currentUser, pathName);
    queueMessageToJMS(new FileArrivalEvent(user, pathName);
} catch(Exception e) {
    rollbackWork();
} finally {
    commitWork();
}