当前位置: 首页 > 工具软件 > Narayana > 使用案例 >

在Tomcat中配置与使用Narayana作为事务处理器

颛孙森
2023-12-01

Narayana是一款使用Java来实现JTA标准的事务处理器,也做为Wildfly自带的事务处理器。这篇文章的目的是在Tomcat容器中配置Narayana来使之能够支持事务处理。

如果对JTA标准不太熟悉,可以看看这里JTA SPEC。事务处理器(Transaction Manager)的工作就是协调各个参与事务的资源(数据库,消息队列等等),来完成一个事务并且符合ACID的要求。我们来看一个简单的事务处理的例子

//开始一个事务
Transaction tx = TransactionManager.begin();
XADataSource ds = new XADataSource();
tx.enlist(ds.getXAResource());
Connection connection = ds.getConnection();

//进行数据库操作
connection.execute(...);

//提交事务
TransactionManager.commit();

这里最重要的就是要配置一个支持XA的数据库源。我们会介绍三种配置方法并且进行分析和比较,接下来先看看如何在Tomcat中配置Narayana事务处理器。我们需要用到Narayana中的tomcat-jta这个包,下面是具体的context.xml配置文件

<Transaction factory="org.jboss.narayana.tomcat.jta.UserTransactionFactory"/>
<Resource factory="org.jboss.narayana.tomcat.jta.TransactionManagerFactory"
          name="TransactionManager" type="javax.transaction.TransactionManager"/>
<Resource factory="org.jboss.narayana.tomcat.jta.TransactionSynchronizationRegistryFactory"
          name="TransactionSynchronizationRegistry" type="javax.transaction.TransactionSynchronizationRegistry"/>

然后我们来看看如何配置数据库源

 

  1. 使用tomcat-jta提供的TransactionalDataSourceFactory,下面是具体的Datasource配置
    <Resource auth="Container" databaseName="test" description="Data Source"
            factory="org.postgresql.xa.PGXADataSourceFactory" loginTimeout="0"
            name="myDataSource" password="test" portNumber="5432" serverName="localhost"
            type="org.postgresql.xa.PGXADataSource" user="test" username="test"
            uniqueName="myDataSource" url="jdbc:postgresql://localhost:5432/test"/>
    <Resource auth="Container" description="Transactional Data Source"
            factory="org.jboss.narayana.tomcat.jta.TransactionalDataSourceFactory"
            initialSize="10" jmxEnabled="true" logAbandoned="true" maxAge="30000"
            maxIdle="16" maxTotal="4" maxWaitMillis="10000" minIdle="8"
            name="transactionalDataSource" password="test" removeAbandoned="true"
            removeAbandonedTimeout="60" testOnBorrow="true" transactionManager="TransactionManager"
            type="javax.sql.XADataSource" uniqueName="transactionalDataSource"
            username="test" validationQuery="select 1" xaDataSource="myDataSource"/>
  2. web.xml配置中使用NarayanaJtaServletContextListener进行一些初始化工作
    <web-app>
        <listener>
            <listener-class>org.jboss.narayana.tomcat.jta.NarayanaJtaServletContextListener</listener-class>
        </listener>
    </web-app>

     

  3. 示例代码可以通过https://github.com/jbosstm/quickstart/tree/master/dbcp2-and-tomcat查看

目前Narayana和Tomcat的集成代码已经迁移到https://github.com/web-servers/narayana-tomcat

 类似资料: