【问题标题】:WebSphereUowTransactionManager returning null transactionManagerWebSphereUowTransactionManager 返回 null 事务管理器
【发布时间】:2014-02-26 21:48:57
【问题描述】:

我有一个遗留代码,它使用 TransactionManager 获取对事务的访问权限,以便在提交后将同步对象与事务关联。

当我迁移到 Spring 3 时,我的解决方案推荐的事务管理器是 WebSphereUowTransactionManager,实际上,我觉得它只是真正的事务管理器的工厂。但是这个事务管理器总是在 getTransactionManager() 方法中返回 null。

我正在使用 EJB 的 2.1(旧版,还记得吗?)和 CMT。

我的配置是Spring 3.1.2.RELEASE,Hibernate 3.6.8.Final,Websphere 6.1.0.43,我的bean是:

<bean 
    id="transactionManager" 
    class="org.springframework.transaction.jta.WebSphereUowTransactionManager" />   


<bean 
    name="auditContextManager" 
    class="... my class ...">
    <property name="transactionManager">
        <bean factory-bean="transactionManager" factory-method="getTransactionManager" />
    </property>
</bean>

我的休眠配置是:

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.jdbc.fetch_size">200</property>
    <property name="hibernate.jdbc.use_get_generated_keys">true</property>
    <property name="hibernate.bytecode.use_reflection_optimizer">true</property>
    <property name="hibernate.connection.datasource">java:comp/env/jdbc/ORDS</property>
    <property name="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</property>
    <property name="hibernate.max_fetch_depth">3</property>
    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>
    <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</property>
    <property name="hibernate.show_sql">false</property>
    ... too much mappings to show here ...
  </session-factory>
</hibernate-configuration>

而且我的 bean auditContextManager 始终将 transactionManager 设置为 null。

在我看来,WebSphereUowTransactionManager 并没有故意公开事务管理器。这可以吗?

有什么方法可以让我获得事务管理器?由于 WebSphereUowTransactionManager 并不是真正的事务管理器,而只是一个事务管理器工厂。

【问题讨论】:

    标签: spring hibernate transactions websphere transactionmanager


    【解决方案1】:

    它不是TransactionManager 的工厂,而是顾名思义,UOWManager。它使用 Websphere 原生 API 来管理事务(它对某些事物的支持比普通的 JTA api 更广泛)。

    所以不会有TransactionManager,它将永远是null

    基本上,如果您想要事务管理器,则必须进行 JNDI 查找。

    【讨论】:

    • 谢谢你。您知道使用 Spring 3 的正确方法吗?
    • 只需查找事务管理器(&lt;jee:jndi-lookup id="jtaTxManager" jndi-name="java:comp/TransactionManager" /&gt; 不确定这是否是正确的名称,但您应该明白)。
    • 好主意 Deinum,但是,它是 Websphere,另一个世界。在其他 J2EE 服务器中,这可以正常工作,但在 Websphere 中则不行。 java:comp 命名空间中唯一可用的名称是:/ORB、/websphere/UOWManager、/websphere/ApplicationNotificationService、/websphere/AppProfile/TaskNameManager、/websphere/WorkAreaPartitionManager、/websphere/ExtendedJTATransaction、/websphere/UOWSynchronizationRegistry、/HandleDelegate、/用户事务。
    • 我不知道 websphere 中的名称,但我认为某处必须有一个普通的 JTA 事务管理器可用。只要找出正确的名称,它只是一个示例,让您了解如何做事。
    • 我在某处读过“websphere 不导出事务管理器”。
    【解决方案2】:

    com.ibm.ws.Transaction.TransactionManagerFactory 是您应该用来获取事务管理器的工厂。

    【讨论】:

    • com.ibm.ws.Transaction.TransactionManagerFactory 被视为内部产品,因此不受应用程序支持。
    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 2012-04-23
    • 2011-12-10
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    相关资源
    最近更新 更多