【问题标题】:Spring jta-transaction-managerSpring jta事务管理器
【发布时间】:2009-12-26 15:26:57
【问题描述】:

使用Spring

  1. jta-transaction-manager 是否可以使用 id 作为名称,以便我可以将其作为 REF 传递给我的服务层,如下所示?

  2. tx:jta-transaction-manager 是否只能用于 je22 容器?我的意思是Tomcat,我需要手动完成,如下所示:

    <tx:jta-transaction-manager id="name_transactionmanager"/>
    
        <bean id="projectService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager"
                      ref="name_transactionmanager"/>
            <property name="target">
                <bean
                  class="com.company.project.company.services.ServiceImpl"
                  init-method="init">
                     <property
                       name="HRappsdao"
                       ref="HRappsdao"/>
                     <property
                       name="projectdao"
                       ref="projectdao"/>
                </bean>
            </property>
            <property name="transactionAttributes">
                <props>
                    <prop key="store*">PROPAGATION_REQUIRED</prop>
                    <prop key="update*">PROPAGATION_REQUIRED</prop>
                    <prop key="remove*">PROPAGATION_REQUIRED</prop>
                    <prop key="bulkUpdate*">PROPAGATION_REQUIRED</prop>
                    <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
                </props>
            </property>
        </bean>
    

关于问题 2

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

【问题讨论】:

    标签: java hibernate spring jpa jta


    【解决方案1】:

    tx:jta-transaction-manager 可以使用 id 作为名称,以便我可以将其作为 REF 传递给我的服务层,如下所示?

    &lt;tx:jta-transaction-manager&gt; 将事务管理器公开为 Spring 上下文中名为“transactionManager”的 Bean。

    tx:jta-transaction-manager 是否只能用于 J2EE 容器?

    引用 Spring 文档中的 Chapter 9. Transaction management

    事务管理是否需要应用服务器?

    Spring 框架的事务 管理支持显着 改变传统的思维方式 当 J2EE 应用程序需要 应用服务器。

    特别是,您不需要 应用服务器只是为了拥有 通过 EJB 的声明式事务。在 事实上,即使你有一个应用程序 具有强大 JTA 功能的服务器, 你可能会决定春天 框架的声明性事务 提供更多的力量和更多 比 EJB 更高效的编程模型 CMT。

    通常您需要一个应用程序 服务器的 JTA 功能仅当您 需要征集多个事务 资源,并适用于许多应用程序 能够处理交易 跨多个资源不是 要求。例如,许多 高端应用使用单个, 高度可扩展的数据库(例如 Oracle 9i RAC)。独立交易 Atomikos Transactions等经理 和JOTM 是其他选项。 (当然 您可能需要其他应用程序服务器 JMS 和 JCA 等功能。)

    最重要的一点是 您可以选择的 Spring 框架 何时将您的应用程序扩展到 成熟的应用服务器。走了 是唯一选择的日子 使用 EJB CMT 或 JTA 是写 使用本地事务的代码,例如 那些在 JDBC 连接上的,并面临一个 如果您需要,则进行大量返工 在全局范围内运行的代码, 容器管理的事务。和 Spring 框架,仅 配置需要更改,以便 您的代码不必这样做。

    因此,如第三段所述,如果您想使用多个事务资源,则需要涉及支持 JTA 的应用程序服务器的全局事务。 支持 JTA 的应用服务器是指真正的 J2EE 容器或非 J2EE 容器(如 Tomcat),具有独立的事务管理器,如 AtomikosJOTMBitronixSimpleJTA、@987654328 @ 或 GeronimoTM/Jencks

    FWIW,我看到很多关于 JOTM 的抱怨,我认为 GeronimoTM/Jencks 缺乏文档,我真的不能说关于 JBossTSArjunaTS 的任何事情(除了它是坚如磐石的产品),SimpleJTA 和 Bitronix 都有很好的文档,Atomikos 也是一个令人印象深刻的产品,文档也很丰富。就个人而言,我会选择 Bitronix 或 Atomikos。

    PS:老实说,如果这听起来像中文,您可能应该考虑使用单个数据库(如果这是一个选项,去吧!)或考虑使用真正的 J2EE 容器,例如正如我在之前的回答中所写的那样,JBoss 或 GlassFish。无意冒犯,但所有这些 JTA 的东西都不是微不足道的,如果你真的不明白为什么需要它,走 JOTM 路径并不是那么简单。

    【讨论】:

    • 您的回答非常好,我来到这个线程寻找一种方法来单元测试我的 DAO(即 EJB 本身并使用其他 EJB,以及需要事务上下文)在容器外但使用实时数据库。我能够在 POJO 中模拟大多数其他 EJB 逻辑,但是由于缺少事务上下文,一些其他代码在运行测试时失败。我不能使用 Spring,我想它至少需要一个网络服务器。仅对单元测试来说,使用独立的事务管理器似乎有点过头了,或者你怎么看?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2020-12-07
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多