zoukankan      html  css  js  c++  java
  • JTA事务管理--配置剖析(二)

    Spring引用Tomcat的 JTA事务 
        Tomcat是Servlet容器,但它提供了JNDI的实现,因此用户可以象在Java EE应用程序服务器中一样,在Tomcat中使用JNDI查找JDBC数据源。在事务处理方面,Tomcat本身并不支持JTA,但是可以通过集成JOTM达到目的。 

        如果你的应用最终部署到一个功能齐备的Java EE应用服务器上,也许你更希望使用Java EE应用服务器的JTA功能,这样可以利用应用服务器本身许多优化措施。下面,我们让Tomcat通过JNDI开放JOTM的JTA的数据源,进而在Spring容器引用这个JNDI数据源,并在此基础上提供JTA事务。我们所使用的环境是:Tomcat 5.5+JOTM 2.3。 
        1. 添加所需的JAR文件 
        将JOTM以下类包添加到<Tomcat安装目录>/common/lib目录中: 
        jotm.jar 
        jotm_jrmp_stubs.jar 
        jotm_iiop_stubs.jar 
        ow_carol.jar 
        jta-spec1_0_1.jar 
        jts1_0.jar 
        objectweb-datasource.jar 
        xapool.jar 
        howl.jar 
        connector-1_5.jar 
        同时,还需要添加相应数据库的JDBC驱动类包,例如MySQL的mysql.jar。 

        2. 配置JOTM
     
        新建一个carol.properties配置文件,放置到<Tomcat安装目录>/common/classes目录下,配置文件内容如下: 
        

        #JNDI调用协议 
        carol.protocols=jrmp 
        # 本地RMI调用 
        carol.jvm.rmi.local.call=true 
        # 不使用CAROL的JNDI封装器 
        carol.start.jndi=false 
        # 不启用命名服务器 
        carol.start.ns=false 
        # 命名工厂类 
        carol.jndi.java.naming.factory.url.pkgs=org.apache.naming 

        将carol.start.jndi设置为false,让JOTM不使用CAROL JNDI wrapper,从而可以避免类装载错误的发生。 

        3. 配置Tomcat环境,配置JNDI的数据源 
        在<Tomcat安装目录>/conf/context.xml文件中添加以下内容: 

    <Resource name="jdbc/topicDS" auth="Container" type="javax.sql.DataSource" ①-1:JNDI数据源 
    factory="org.objectweb.jndi.DataSourceFactory" 
    username="root" password="1234" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://localhost:3309/topicdb" 
    maxActive="30" 
    maxIdle="30"/> 
    <Resource name="jdbc/postDS" auth="Container" type="javax.sql.DataSource" ①-2:JNDI数据源 
    factory="org.objectweb.jndi.DataSourceFactory" 
    username="root" password="1234" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://localhost:3309/postdb" 
    maxActive="30" 
    maxIdle="30"/> 
    ②JOTM JTA事务管理 
    <Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60"/>

        在Tomcat中配置两个JNDI数据源,它们分别指向topicdb和postdb数据库,如①处所示。最后配置JOTM的JTA事务管理器,该事务管理器自动对两个JNDI中的数据源应用JTA事务。

    4. Spring中相应的配置 
        让应用服务器提供JNDI数据源管理和JTA事务后,Spring肩上的担子减轻了许多,Spring要做的只是简单地引用JNDI的数据源,并启用JtaTransactionManager就可以了。 
        代码清单 4 applicationContext-jta-tomcat.xml:使用应用服务器的JTA支持 

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
        ①使用Tomcat JNDI的数据源 
    <jee:jndi-lookup id="topicDS" jndi-name="java:comp/env/jdbc/topicDS" /> 
    <jee:jndi-lookup id="postDS" jndi-name="java:comp/env/jdbc/postDS" /> 
    <bean id="topicTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
        <property name="dataSource" ref="topicDS" /> 
    </bean> 
    <bean id="postTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
        <property name="dataSource" ref="postDS" /> 
    </bean> 
    <bean id="topicDao" class="com.baobaotao.dao.jdbc.TopicJdbcDao"> 
        <property name="jdbcTemplate" ref="topicTemplate" /> 
    </bean> 
    <bean id="postDao" class="com.baobaotao.dao.jdbc.PostJdbcDao"> 
        <property name="jdbcTemplate" ref="postTemplate" /> 
    </bean> 
    <bean id="bbtForum" class="com.baobaotao.service.impl.BbtForumImpl"> 
        <property name="topicDao" ref="topicDao" /> 
        <property name="postDao" ref="postDao" /> 
    </bean>
     

        ②只需要指定一个JTA事务管理器就可以了,Spring会自动使用Tomcat中的JTA事务功能 

    <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"/> 
    <tx:annotation-driven transaction-manager="txManager" />
    </beans>

        在①处,我们通过Spring jee命名空间提供的<jee:jndi-lookup>标签获取应用服务器中的JNDI资源,并将它们声明为一个Bean以供持久化模板类引用。 
        和直接在Spring中使用JOTM不一样,这时,我们仅需要简单地配置一个JtaTransactionManager就可以了,该事务管理器将自动将JTA事务委托给应用程序器。 
        Spring引用Java EE应用服务器 JTA事务功能和Tomcat+JOTM提供JTA事务功能的配置步骤基本相似,相信大家可以对照这个实例完成相应的配置。另外,这里的实例采用了Spring JDBC作为持久层实现技术,你完全可以通过少量的调整将其应用到JPA、Hibernate、iBatis等持久化实现技术中。
    在特定应用服务器使用JTA 
        一般来说,Spring的事务抽象与应用服务器是无关的。不过,如果你如果希望事务管理器使用特定的UserTransaction 和 TransactionManager 对象(可以被自动探测),以获取更多的增强事务语义。这时,针对不同的Java EE应用服务器,Spring的事务管理器可以采取不同的配置。 

    ? BEA WebLogic
     
        在一个使用WebLogic 7.0、8.1或更高版本的环境中,你一般会优先选用特定于WebLogic的 WebLogicJtaTransactionManager 类来取代基础的 JtaTransactionManager 类,因为在WebLogic环境中,该类提供了对Spring事务定义的完全支持,超过了标准的JTA语义。你可以使用以下的配置达到目的: 

    <bean id="txManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/> 

    它的特性包括:支持事务名,支持为每个事务定义隔离级别,以及在任何环境下正确地恢复事务的能力。 

    ? IBM WebSphere
     
        在WebSphere 5.1、5.0和4.x环境下,你可以使用Spring的 WebSphereTransactionManagerFactoryBean 类。这是一个工厂类,通过WebSphere的 静态访问方法(每个版本的WebSphere中都不同)获取到JTA TransactionManager 实例。一旦通过工厂bean获取到JTA TransactionManager 实例,就可以使用该实例装配一个Spring的 JtaTransactionManager bean,它封装了JTA UserTransaction,提供增强的事务语义。你可以按以下方式进行配置: 

    <bean id="wsJtaTm" class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean"/> 
      <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager ref="wsJtaTm"/>①引用WebSphere的JTA事务管理器
    </bean>

        小结 
        你既可以在没有任务应用服务器支持的情况下,直接通过集成JOTM在Spring中使用JTA事务管理,也可以通过引用Java EE应用服务器的JNDI数据源,利用应用服务器提供的JTA事务功能间接实现Spring 中的JTA事务管理。为了利用一些高级Java EE应用服务器的JTA事务高级功能,你可以通过Spring所提供的特定于应用服务器的JTA事务管理器进行配置。

  • 相关阅读:
    软件工程第二次作业
    软件工程第一次作业
    软件工程最后一次作业
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    《算法笔记》2.2小节——C/C++快速入门->顺序结构
    大数阶乘
    printf("%f ",5)的输出结果为什么是0.000000
  • 原文地址:https://www.cnblogs.com/duanxz/p/4666517.html
Copyright © 2011-2022 走看看