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"/>
然后我们来看看如何配置数据库源
<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"/>
<web-app>
<listener>
<listener-class>org.jboss.narayana.tomcat.jta.NarayanaJtaServletContextListener</listener-class>
</listener>
</web-app>
目前Narayana和Tomcat的集成代码已经迁移到https://github.com/web-servers/narayana-tomcat