- 浏览: 299420 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
xiebo1983:
http://sqkoo.com/mysql-function ...
DATE_FORMAT -
topbox163:
JAR包是:mysql-connector-java-5.1. ...
grails配置mysql -
独门记忆:
请问怎样在Tomcat服务器中运行该项目,进行相关的操作呢?
将JBPM4整合到web工程 -
39246302:
谢谢分享
Android之PreferenceActivity -
大柳树:
快速布局???这个PreferenceActivity是做什么 ...
Android之PreferenceActivity
不知道spring的事务支持跨库数据处理吗?明天试下。
查了下资料:
跨库事务处理 spring+hibernate+struts2+jta
http://huqilong.blog.51cto.com/53638/109109
最近做东西,不想数据太集中,所以将数据分散到多个数据库中,但是往多个数据库中插入数据是在是很痛苦的一件事,因为涉及到事务的一致性问题,比如我把用户和图书的表分开来存,当某个用户存一本书的时候,我必须修改用户的最后更新时间,和书的内容,一旦其中一个更新失败,都需要回滚。
参考了一下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 test 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("鸡肉");
introduce i=new introduce();
i.setName("大大牌鸡肉");
myService service=(myService)factory.getBean("myService");
/**
这里我测试了两次
service.saveSomthing(p, i);
能够成功保存,
如果使用
service.saveSomthing(p, null);
则两个数据都保存不上
*/
service.saveSomthing(p, i);
}
}
缺点:使用xml太复杂了。
查了下资料:
跨库事务处理 spring+hibernate+struts2+jta
http://huqilong.blog.51cto.com/53638/109109
最近做东西,不想数据太集中,所以将数据分散到多个数据库中,但是往多个数据库中插入数据是在是很痛苦的一件事,因为涉及到事务的一致性问题,比如我把用户和图书的表分开来存,当某个用户存一本书的时候,我必须修改用户的最后更新时间,和书的内容,一旦其中一个更新失败,都需要回滚。
参考了一下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 test 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("鸡肉");
introduce i=new introduce();
i.setName("大大牌鸡肉");
myService service=(myService)factory.getBean("myService");
/**
这里我测试了两次
service.saveSomthing(p, i);
能够成功保存,
如果使用
service.saveSomthing(p, null);
则两个数据都保存不上
*/
service.saveSomthing(p, i);
}
}
缺点:使用xml太复杂了。
发表评论
-
12个最重要的J2EE最佳实践
2010-04-21 08:31 1023http://www.javanb.com/j2ee/1/20 ... -
将JBPM4整合到web工程
2010-03-13 18:11 17981.在eclipse里面创建一个动态的web项目。 2.在 ... -
工作备忘
2010-01-26 09:32 888<script> ... -
jfreechart1.0.0基本用法
2009-10-23 15:21 1974来自: http://blog.chinaunix ... -
struts标签使用举例-logic
2009-10-13 08:31 1168发现平时写界面,都用到很多的<%%>,感觉很不爽, ... -
jsp隔行换色
2009-10-12 16:40 1469<logic:iterate indexId=&quo ... -
实体类创建注意
2009-10-10 20:55 1113今天在做项目的时候发现不能创建EntityManage ... -
EJB3 QL查询
2009-10-10 12:27 1270http://www.diybl.com/course/3_p ... -
CheckBox单选
2009-09-01 08:06 7255http://www.cnblogs.com/mextb1 ... -
[JSP]读取客户端文件
2009-08-27 12:27 2917http://hi.baidu.com/fableking/b ... -
tomcat + ssi
2009-08-03 12:43 2093在目前的Tomcat中,shtml默认是不支持的,需要进行一定 ... -
远程调试Tomcat
2009-07-16 20:15 984http://hi.baidu.com/flierssp/bl ... -
dwr中的异常处理
2009-07-15 20:22 3938一天一位老兄问我,我用的dwr怎么没有包装异常,以前我通过包装 ... -
Log4j使用总结
2009-07-14 16:36 1127收藏: http://kdboy.iteye.com/blog ... -
打造自己的单元测试容器——Junit Runner扩展详解
2009-07-12 10:22 2150http://rdc.taobao.com/blog/arch ... -
myeclipse不能编译、有错误不提示问题解决
2009-07-09 22:36 9679myeclipse7.5太庞大了,安装也太慢了,而且有好多看不 ... -
MyEclipse-7.5.0版注册码破解及激活操作
2009-07-09 22:30 9212http://blog.csdn.net/login8226/ ... -
Hibernate不同数据库的连接及SQL方言
2009-04-09 16:54 1236<!--MySql 驱动程序 eg. mysql-con ... -
初试Grails和Oracle的配置
2009-04-09 16:53 2056在听说过Grails很久后,终于开始了自己的Grails之旅, ... -
js中option操作
2009-03-26 15:31 3721<html> <head> ...
相关推荐
它提供了模板类和回调接口,简化了数据库操作,并通过声明式事务管理进一步降低了事务处理的复杂性。 **Bean的生命周期管理** Spring管理的Bean有其特定的生命周期,包括初始化、正常使用和销毁。在Spring 2.5中,...
2. **AOP(面向切面编程)**:Spring 2.5支持更强大的AOP功能,允许开发者定义和执行横切关注点,如日志、事务管理等,这些关注点可以独立于业务逻辑进行处理。 3. **XML配置增强**:在Spring 2.5中,XML配置文件...
Spring 2.5的事务管理是另一个重要的功能,它支持编程式和声明式事务管理,确保了在多层架构中的数据一致性。 通过对Spring 2.5源代码的深入研究,开发者不仅可以了解其工作原理,还能学习到良好的设计模式和最佳...
通过阅读《Spring2.5-中文参考手册.chm》这份文档,开发者可以深入了解Spring 2.5的各种特性和用法,解决实际开发中遇到的问题,提升开发效率。文档不仅包含详细的API参考,还包含丰富的示例和最佳实践指导,是学习...
Spring 2.5在ORM方面的改进包括对JPA 2.0的支持和更灵活的事务策略。 6. **UML框架图**:提供的"spring 2.5框架图"很可能是用UML(统一建模语言)绘制的,它展示了Spring 2.5各模块之间的关系和交互。通过这样的...
引入了`@Transactional`注解,允许在方法级别声明事务管理,简化了事务处理代码。 5. **容器改进**:Spring 2.5的IoC容器增强了对Java 5和6特性的支持,如泛型和注解。同时,提供了更强大的Bean定义合并功能,使得...
Spring2.5版本是该框架的一个重要里程碑,引入了许多改进和新特性,为开发者提供了更丰富的功能和更好的灵活性。这个"Spring2.5中文框架开发手册"旨在帮助中国开发者更好地理解和应用Spring框架,尤其是对于那些不...
然而,在Spring 2.5时代,JOTM和`JotmFactoryBean`是进行分布式事务处理的一个实用选择。 除了这些,Spring 2.5还引入了对Java Persistence API (JPA) 的全面支持,允许开发者利用ORM(对象关系映射)技术进行数据...
Struts1.2、Spring2.5和Hibernate3.2是经典的Java企业级开发框架组合,它们各自在应用程序的不同层次上发挥着重要作用。Struts1.2是一个MVC(Model-View-Controller)框架,主要负责处理用户界面与业务逻辑之间的...
2. **AOP(Aspect-Oriented Programming, 面向切面编程)**:Spring 2.5支持AOP,允许开发者定义横切关注点,如日志、事务管理等,这些关注点可以被织入到多个业务对象中,降低了代码的冗余。 3. **XML配置与注解...
Spring2.5是全面的企业级应用框架,它不仅包含IoC(Inversion of Control,控制反转)容器,用于管理对象的生命周期和依赖关系,还提供了AOP(Aspect-Oriented Programming,面向切面编程)功能,实现了对横切关注点...
Spring 2.5 AOP(面向切面编程)是Java应用程序中的一个重要概念,它允许开发者在不修改原有代码的情况下插入新的行为或监控。这个例子旨在帮助我们理解和应用Spring框架的AOP特性。以下是对该主题的详细解释: 一...
Spring 2.5 实现事务管理(本地事务、分布式事务) Spring 框架提供了对事务管理的支持,它可以使得事务的管理变得更加简洁和灵活。事务管理是指在多个操作中维持一致性的机制,它可以确保在多个操作中,如果某个...
Spring 2.5 是 Spring 框架的一个重要版本,它在之前的版本基础上引入了许多增强功能和改进,为开发者提供了更强大的工具集。这个压缩包包含的“spring常用包”很可能是为了帮助开发者理解并使用 Spring 2.5 的核心...
标题中的“spring2.5 hibernate3.2 事务”涉及到的是两个关键的Java开发框架——Spring和Hibernate,以及它们在处理事务管理方面的整合。Spring是面向切面编程(AOP)的轻量级框架,提供了强大的事务管理功能;...
3. Spring 2.5新特性:支持JSR-303 Bean Validation,提供注解驱动的事务管理,增强了AOP支持,以及对注解配置的进一步强化。 二、iBatis 2介绍 1. iBatis概念:iBatis是一个基于Java的持久层框架,它允许开发者...
此外,Spring的事务管理功能也使得跨库操作更加便捷。 六、Web应用支持 在Web开发方面,Spring 2.5集成了Struts等MVC框架,提供了Model-View-Controller的设计模式,使得业务逻辑、视图和控制层分离,降低了复杂性...
这个"传智播客 spring2.5源代码_lib包"包含了Spring框架2.5版本的库文件,这些库文件对于理解Spring的工作原理、学习如何使用它以及进行相关开发非常有帮助。下面我们将深入探讨Spring 2.5的一些核心概念和功能。 1...
《传智播客 黎活明spring2.5 ppt》是针对Java开发人员的一个培训资料,由知名讲师黎活明主讲,主要讲解了Spring框架2.5版本的相关知识。Spring是一个开源的Java企业级应用框架,它为开发人员提供了一个全面的编程和...
这个`Spring2.5中文手册`是一个非常有价值的参考资料,帮助开发者深入理解并有效地利用Spring框架。 1. **Spring概述** - Spring是一个开源的Java平台,它提供了全面的应用程序架构支持,简化了Java Enterprise ...