




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在Spring中使用JTA事务管理Spring 通过AOP技术可以让我们在脱离EJB的情况下享受声明式事务的丰盛大餐,脱离Java EE应用服务器使用声明式事务的道路已经畅通无阻。但是很大部分人都还认为脱离Java EE应用服务器就无法使用JTA事务,这是一个误解。其实,通过配合使用ObjectWeb的JOTM开源项目,不需要Java EE应用服务器,Spring也可以提供JTA事务。正因为AOP让Spring拥有了脱离EJB容器的声明式事务能力,而JOTM让我们在脱离Java EE应用服务器下拥有JTA事务能力。所以,人们将AOP和JOTM称为Java软件开发的两个圣杯。 本文将讲解Spring在不同环境下提供JTA事务的配置过程,这包括:Spring中直接集成JOTM提供JTA事务管理、将JOTM集成到Tomcat中,Spring通过引用Tomcat JNDI数据源提供JTA事务管理、引用其他功能完善JavaEE应用服务器所提供的JTA事务管理。 通过集成JOTM,直接在Spring中使用JTA事务 JOTM(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现,它本身也是开源应用程序服务器JOnAS(Java Open Application Server)的一部分,为其提供JTA分布式事务的功能。Spring 2.0附带的依赖类库中虽然包含jotm类库,但是并不完整,你可以到下载完全版的JOTM。Spring为JOTM提供了一个org.springframework.transaction.jta.JotmFactoryBean支持类,通过该支持类可以方便地创建JOTM本地实例。下面,我们通过配置,使上节中BbtForumImpl#addTopic()方法工作在JTA事务的环境下。addTopic()内部使用两个DAO类(TopicDao和PostDao)分别访问不同数据库中的表。通过下面的步骤说明了使addTopic()方法拥有JTA事务的整个过程: 1 将JOTM以下类库添加到类路径中:jotm.jarxapool.jarjotm_jrmp_stubs.jarjta-spec1_0_1.jarconnector-1_5.jar 2 编写JOTM配置文件,放到类路径下perties#JNDI调用协议tocols=jrmp#不使用CAROL JNDI封装器carol.start.jndi=false#不启动命名服务器carol.start.ns=false 3 在MySQL上建立两个数据库在MySQL数据库中运行SQL脚本,建立topicdb和postdb两个数据库,在topicdb数据库中创建t_topic表,在postdb数据库中创建t_post表。我们希望在这两个数据库上进行JTA事务。SQL脚本如下所示:/*/*=创建topicdb数据源及t_topic表=*/DROP DATABASE IF EXISTS topicdb;CREATE DATABASE topicdb DEFAULT CHARACTER SET utf8;USE topicdb;drop table if exists t_topic;create table t_topic(topic_id int(11) not null auto_increment,forum_id int(11) not null default 0,topic_title varchar(100) not null default ,user_id int(11) not null default 0,topic_time datetime default NULL,topic_views int(11) default 1,topic_replies int(11) default 0,primary key (topic_id);create index IDX_TOPIC_USER_ID on t_topic(user_id);/*=创建postdb数据源及t_ postdb表=*/DROP DATABASE IF EXISTS postdb;CREATE DATABASE postdb DEFAULT CHARACTER SET utf8;USE postdb;create table t_post(post_id int(11) not null auto_increment,topic_id int(11) not null default 0,forum_id int(11) not null default 0,user_id int(11) not null default 0,post_text text,post_attach blob,post_time datetime default NULL,primary key (post_id);create index IDX_POST_TOPIC_ID on t_post(topic_id); 4 在Spring配置文件中配置JOTM代码清单 1: applicationContext-jta.xmlJOTM本地实例 JTA事务管理器 -1:指定userTransaction属性XAPool配置,内部包含了一个XA数据源,对应topicdb数据库-1:内部XA数据源按照相似的方式配置另一个XAPool,对应postdb数据库,配置访问topicDB数据源的Spring JDBC模板配置访问postDB数据源的Spring JDBC模板基于topicTemplate数据源的topicDao基于postTemplate数据源的postDao进行跨数据库JTA事务的业务类对BbtForumImpl业务类中的Transaction注解进行驱动首 先,我们在处通过Spring所提供的JotmFactoryBean创建一个本地JOTM实例,该实例同时实现了 javax.transaction.UserTransaction和javax.transaction.TransactionManager接 口,它可以和ObjectWeb的XAPool一起工作。 JTA事务管理器通过userTransaction属性引用本地JOTM实例,Spring的JtaTransactionManager会自动探测 到传入的javax.transaction.UserTransaction引用也实现了 javax.transaction.TransactionManager,所以我们无需再配置JtaTransactionManager的 transactionManager属性,如所示。 在Spring中配置JOTM的另一个关键问题是配置XAPool,支持JTA事务的数据源必须封装成XAPool。首先,我们通过 org.enhydra.jdbc.standard.StandardXADataSource 配置一个XA数据源,它指向topicdb数据库,如-1所示。而后,通过 org.enhydra.jdbc.pool.StandardXAPoolDataSource将其封装成一个XAPool,如所示。按照相同的方 式,配置指向postdb数据库的XAPool,如所示。 接下来的配置就顺理成章了,分别使用Spring JDBC的模板类配置DAO类,然后再配置引用DAO类的业务类。关于Spring JDBC的详细内容,参见第10章的内容。这里,我们使用Transaction注解对业务类BbtForumImpl进行事务声明,所以通过对此进行驱动,BbtForumImpl的代码如下所示:代码清单 2 BbtForumImplpackage com.baobaotao.service.impl;import org.springframework.transaction.annotation.Transactional;import com.baobaotao.dao.PostDao;import com.baobaotao.dao.TopicDao;import com.baobaotao.domain.Forum;import com.baobaotao.domain.Topic;import com.baobaotao.service.BbtForum;Transactional 事务注解,以便Spring动态织入事务管理功能public class BbtForumImpl implements BbtForum .private TopicDao topicDao;private PostDao postDao;public void addTopic(Topic topic) throws Exception . 将方法将被施加JTA事务的增强topicDao.addTopic(topic);postDao.addPost(topic.getPost();BbtForumImpl将Dao类组织起来,PostDao和TopicDao分别访问不同数据库中表,通过Spring注解驱动事务切面的增强后,它们将工作于同一个JTA事务中。5 在Spring中运行测试代码清单 3 TestBbtForumJtapackage com.baobaotao.service;import org.springframework.test.AbstractDependencyInjectionSpringContextTests;public class TestBbtForumJta extends AbstractDependencyInjectionSpringContextTests.private BbtForum bbtForum;private final Logger logger = Logger.getLogger(getClass();public void setBbtForum(BbtForum bbtForum) .this.bbtForum = bbtForum;protected String getConfigLocations() .return new String.classpath:applicationContext-jta.xml;public void testAddPost() throws E(begin.);Topic topic = new Topic();topic.setTopicTitle(Title -pfb);Post post = new Post();post.setPostText(post content -pfb);topic.setPost(post);bbtForum.addTopic(topic); 使用了JTA事务的业务方法(end.); 通过Spring测试类AbstractDependencyInjectionSpringContextTests的支持,很容易编写一个测试类, 对启用了JTA事务的BbtForum#addTopic()方法进行测试。建议你将Log4J设置为DEBUG,这样就可以通过丰富的输出日志观测到 JTA事务的执行情况。运行这个测试类后,你将可以看到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以下类包添加到/common/lib目录中:jotm.jarjotm_jrmp_stubs.jarjotm_iiop_stubs.jarow_carol.jarjta-spec1_0_1.jarjts1_0.jarobjectweb-datasource.jarxapool.jarhowl.jarconnector-1_5.jar同时,还需要添加相应数据库的JDBC驱动类包,例如MySQL的mysql.jar。2 配置JOTM新建一个perties配置文件,放置到/common/classes目录下,配置文件内容如下:#JNDI调用协议tocols=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的数据源在/conf/context.xml文件中添加以下内容:JOTM JTA事务管理在Tomcat中配置两个JNDI数据源,它们分别指向topicdb和postdb数据库,如处所示。最后配置JOTM的JTA事务管理器,该事务管理器自动对两个JNDI中的数据源应用JTA事务。 4 Spring中相应的配置让应用服务器提供JNDI数据源管理和JTA事务后,Spring肩上的担子减轻了许多,Spring要做的只是简单地引用JNDI的数据源,并启用JtaTransactionManager就可以了。代码清单 4 applicationContext-jta-tomcat.xml:使用应用服务器的JTA支持 使用Tomcat JNDI的数据源只需要指定一个JTA事务管理器就可以了,Spring会自动使用Tomcat中的JTA事务功能在处,我们通过Spring jee命名空间提供的标签获取应用服务器中的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 WebLogicn在一个使
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高考物理“兴趣培养”持续激发试题
- 工业技术考试题及答案
- 工程电路考试题及答案
- 2025湖南衡阳市水务投资集团有限公司招聘30人模拟试卷及一套答案详解
- 研发创新守信成果转化保证承诺书(9篇)
- 专属定制产品唯一性保证承诺书8篇
- 企业合同管理流程及模板集
- 2025年高二物理下学期电路分析与应用测试题
- 2025年丙肝知识知识考核试题及答案
- 甘肃电网考试题目及答案
- 介绍钱三强的
- 大学美育课件:中国艺术美-绘画美
- 小学1-6年级英语知识点归纳汇总
- 支气管炎疾病演示课件
- JCT2217-2014 环氧树脂防水涂料
- 高中英语最全动词不规则变化表(附检测版)
- 《客舱安全管理与应急处置》教案 第6课 认识撤离设备
- 人教版七年级数学上册《填幻方》PPT
- 支护桩锚索施工方案
- 药品不良反应和医疗器械不良事件监测培训终杨课件
- 海尔人单合一管理模式课件
评论
0/150
提交评论