跨库事务处理 spring+hibernate+struts2+jta
最近做东西,不想数据太集中,所以将数据分散到多个数据库中,但是往多个数据库中插入数据是在是很痛苦的一件事,因为涉及到事务的一致性问题,比如我把用户和图书的表分开来存,当某个用户存一本书的时候,我必须修改用户的最后更新时间,和书的内容,一旦其中一个更新失败,都需要回滚。
参考了一下spring的文档“事务策略”,终于有了点想法:
首先让我们来配置两个数据源:
两个数据库 jtatest1和jtatest2
分别有两个表,jtatest1.product和jtatest2.introduce
-- Table "product" DDL
CREATE TABLE `product` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) collate utf8_unicode_ci default NULL,
`introduceId` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- Table "introduce" DDL
CREATE TABLE `introduce` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
<!-- 配置两个数据源 -->
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://37.17k.com:3306/jtatest1?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
<property name="maxActive" value="400"/>
<property name="maxIdle" value="30"/>
<property name="maxWait" value="30000"/>
<!--property name="validationQuery" value="select current_date()"/>
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="false"/>
<property name="testWhileIdle" value="true"/-->
</bean>
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://35.17k.com:3306/jtatest?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
<property name="maxActive" value="400"/>
<property name="maxIdle" value="30"/>
<property name="maxWait" value="30000"/>
<!--property name="validationQuery" value="select current_date()"/>
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="false"/>
<property name="testWhileIdle" value="true"/-->
</bean>
<!-- 两个sessionFactory -->
<bean id="mySessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource1"/>
<property name="mappingResources">
<list>
<value>/test/model/product.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.show_sql=true
</value>
</property>
</bean>
<bean id="mySessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource2"/>
<property name="mappingResources">
<list>
<value>/test/model/Introduce.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.show_sql=true
</value>
</property>
</bean>
<!-- 定义两个DAO -->
<bean id="myProductDao" class="test.dao.myProductDaoImpl">
<property name="sessionFactory" ref="mySessionFactory1"/>
</bean>
<bean id="introduceDao" class="test.dao.introduceDaoImpl">
<property name="sessionFactory" ref="mySessionFactory2"/>
</bean>
然后我们来定义事务:
<!-- 事务管理 -->
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />
<bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotm" />
</bean>
<bean id="myService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="myTxManager"/>
<property name="target">
<bean class="test.service.myServiceImpl">
<property name="myProductDao" ref="myProductDao"/>
<property name="introduceDao" ref="introduceDao"/>
</bean>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="excute*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="import*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="publish*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
现在可以测试了:
public class testclass extends HibernateDaoSupport{
private static Log log = LogFactory.getLog(test.class);
public static void main(String args[]){
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
BeanFactory factory = context;
product p=new product();
p.setIntroduceId(1);
p.setName("fenglingcompany");
introduce i=new introduce();
i.setName("fengling");
myService service=(myService)factory.getBean("myService");
/**
这里我测试了两次
service.saveSomthing(p, i);
能够成功保存,
如果使用
service.saveSomthing(p, null);
则两个数据都保存不上
*/
service.saveSomthing(p, i);
}
分享到:
相关推荐
Spring、Hibernate和Struts是Java开发中的三大主流框架,它们分别负责不同的职责,共同构建了企业级应用的基础架构。Spring作为一个全面的轻量级容器,提供了依赖注入(DI)和面向切面编程(AOP)的功能,使得代码...
1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同...
Struts1、Spring和Hibernate是Java Web开发中的三个重要框架,它们各自负责应用程序的不同层面:Struts1专注于表现层管理,Spring提供了强大的依赖注入和事务管理功能,而Hibernate则是持久层解决方案,简化了数据库...
事务处理也交由Spring去管理。 压缩文件中不包含Jar文件(由于全部的Jar将近12M,不能全部上传),所用到的Jar目录为,工程中再也不会出现由于MyEclipse自动整合而出现的大量Jar文件 : Java代码 1. //如果不用,...
SSH框架的优势在于,Struts处理Web交互,Spring管理业务逻辑和对象,Hibernate处理数据持久化,三者分工明确,协同工作,大大提高了开发效率,降低了系统耦合度。这种框架组合为开发者提供了一套完整的解决方案,...
1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同...
Struts2、Spring2和Hibernate是Java Web开发中三大核心框架,它们的整合使用能够构建出高效、松耦合的企业级应用。以下是对这三大框架整合开发所需基本JAR包的详细说明: **Struts2** 是一个强大的MVC(Model-View-...
Spring、Hibernate和Struts2是Java Web开发中的三大主流框架,它们各自负责应用程序的不同层面,协同工作可以构建出高效、可维护的Web应用。在"Spring+Hibernate+Struts2整合(包含Demo)"的压缩包中,我们能看到一个...
通常,这些jar文件会包含Spring的相关库、Hibernate的库、Struts2的库以及可能的公共依赖如log4j、slf4j等。 在lib目录下,你会找到以下类别的jar文件: - Spring框架的库:包括spring-core、spring-context、...
标题和描述中提到的“Struts+...综上所述,Struts+Spring+Hibernate的组合为企业级Java应用程序提供了一个全面的解决方案,涵盖了从前端展示、业务逻辑处理到数据持久化的所有方面,极大地提升了开发效率和代码质量。
Struts 2、Spring 和 Hibernate 3 是Java开发中三个非常重要的框架,它们分别负责Web层、业务层和数据持久化层的管理。这个压缩包集合了这三个框架的核心jar包,为开发者提供了一站式的解决方案,免去了在开发环境中...
1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同...
这个系统采用了经典的Java技术栈,包括Struts1.2、Hibernate3.0、Spring2和DWR,这些都是在21世纪初非常流行的技术组合。 1. **Struts1.2**:Struts是Apache软件基金会下的一个MVC框架,主要用于构建企业级Java Web...
struts hibernate dwr 与Spring完全结合,实现用户列表、信息增、删、改、查、维护时用户重名提示等功能,还包括页面自动转码设置(web.xml),Hibernate管理服务按Bean名称拦截并进行Spring事务管理,完全由Spring...
在JavaEE应用程序开发中,Spring、Struts2和Hibernate3是三个非常重要的框架,它们各自负责不同的职责,而将它们整合在一起可以构建出强大的企业级应用。Spring作为核心框架,提供了依赖注入、AOP(面向切面编程)、...
Struts2、Spring和Hibernate是Java Web开发中的三个核心框架,它们共同构成了经典的"SSH"集成解决方案。这个压缩包包含了这三个框架的基础库文件,使得开发者能够快速搭建一个基于MVC模式的、支持事务管理和对象持久...
它确保在分布式环境中进行事务处理的一致性和可靠性,对于多数据源或跨服务的事务协调至关重要。 7. **Acegi**: Acegi(现在已被Spring Security替代)是一个强大的安全框架,提供认证、授权、会话管理等功能,...
【三大框架整合(Spring...通过以上步骤,Spring、Struts2和Hibernate这三大框架可以协同工作,提供强大的业务逻辑处理、视图展现和数据持久化功能。对于初级开发者来说,理解并实践这一整合过程是提升技能的重要环节。
### Struts2+Spring2+Hibernate3+Annotation所需JAR包详解 在Java Web开发领域,Struts2、Spring2和Hibernate3是三个非常重要的框架,它们分别负责Web层、业务逻辑层和服务持久化层的功能实现。为了更好地整合这三...
Struts2、Spring2 和 Hibernate3 是三个非常重要的开源框架,它们在Java Web开发中扮演着核心角色。这些框架的整合使得开发者能够构建更高效、更模块化的应用程序,同时简化了管理和维护工作。 1. **Struts2**:这...