You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDK8迁移至JDK17后JTA UserTransaction JNDI查找失败求助

JDK8迁移至JDK17后JTA UserTransaction JNDI查找失败问题解决

核心问题分析

Tomcat 10.1本身不内置JTA事务管理器,且JDK17+Jakarta EE 10环境下原javax命名空间已全面迁移至jakarta,再加上当前配置存在语法错误、JTA实现缺失、数据源与事务管理器不匹配等问题,最终导致java:comp/UserTransaction无法被找到。

步骤1:修正XML语法错误

先修复transactionContext.xml中的标签闭合错误:

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionSynchronizationRegistryName" value="java:comp/TransactionSynchronizationRegistry" />
    <property name="userTransactionName"  value="java:comp/UserTransaction" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

(原配置中<bean\>是错误写法,需改为</bean>)

步骤2:引入兼容Jakarta的JTA实现

Tomcat无内置JTA,需添加第三方JTA实现(推荐Atomikos,适配Jakarta EE 10),在pom.xml中添加依赖:

<dependency>
    <groupId>com.atomikos</groupId>
    <artifactId>transactions-jakarta</artifactId>
    <version>6.0.2</version>
</dependency>
<dependency>
    <groupId>com.atomikos</groupId>
    <artifactId>transactions-jdbc-jakarta</artifactId>
    <version>6.0.2</version>
</dependency>

步骤3:调整Spring事务管理器配置

改用Atomikos专属的事务管理器Bean,替换原JtaTransactionManager配置,避免JNDI查找依赖:

<bean id="userTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
    <property name="transactionTimeout" value="300" />
</bean>

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
    <property name="forceShutdown" value="false" />
</bean>

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="userTransaction" ref="userTransaction" />
    <property name="transactionManager" ref="atomikosTransactionManager" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

步骤4:修正Tomcat Context.xml的XA数据源配置

原StandardXAPoolDataSource适配性差,改用Atomikos的XA数据源,并使用PostgreSQL官方XA驱动:

<Resource name="jdbc/meerkatDataSource" 
          auth="Container"
          type="com.atomikos.jdbc.AtomikosDataSourceBean"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          xaDataSourceClassName="org.postgresql.xa.PGXADataSource"
          uniqueResourceName="meerkatDB"
          maxPoolSize="100"
          minPoolSize="5"
          borrowConnectionTimeout="10000"
          xaProperties.url="projectSpecificURL"
          xaProperties.user="projectSpecificUsername"
          xaProperties.password="projectSpecificPassword"
          validationQuery="select 1" />

同时确保pom.xml包含PostgreSQL驱动依赖:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.7.3</version>
</dependency>

步骤5:更新Hibernate Persistence.xml配置

适配Jakarta命名空间与Atomikos JTA平台:

<property name="hibernate.jndi.class" value="jakarta.naming.InitialContext" />
<property name="jta.UserTransaction" value="java:comp/UserTransaction" />
<property name="hibernate.transaction.coordinator.class" value="jta" />
<property name="hibernate.transaction.jta.platform" value="org.hibernate.engine.transaction.jta.platform.internal.AtomikosJtaPlatform" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.connection.handling_mode" value="DELAYED_ACQUISITION_AND_HOLD" />
  • 替换javax.naming.InitialContext为jakarta.naming.InitialContext(Jakarta EE 10强制要求)
  • 将JTA平台从JOTMJtaPlatform改为AtomikosJtaPlatform,匹配Atomikos实现
  • 移除无效的hibernate.jndi.url配置

关键注意事项

  • 命名空间迁移:所有javax.transaction相关API需替换为jakarta.transaction,Spring 6及Hibernate 6.4已原生支持Jakarta,确保依赖无javax残留
  • JTA版本兼容性:必须使用适配Jakarta EE 10的JTA版本(Atomikos 6.x及以上),旧版本仅支持javax命名空间
  • XA数据源要求:参与JTA全局事务的数据源必须是XA兼容的,普通DataSource无法支持分布式事务

内容的提问来源于stack exchange,提问作者harshal b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:13:17