- 浏览: 294876 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 989http://www.javanb.com/j2ee/1/20 ... -
将JBPM4整合到web工程
2010-03-13 18:11 17561.在eclipse里面创建一个动态的web项目。 2.在 ... -
工作备忘
2010-01-26 09:32 857<script> ... -
jfreechart1.0.0基本用法
2009-10-23 15:21 1929来自: http://blog.chinaunix ... -
struts标签使用举例-logic
2009-10-13 08:31 1123发现平时写界面,都用到很多的<%%>,感觉很不爽, ... -
jsp隔行换色
2009-10-12 16:40 1417<logic:iterate indexId=&quo ... -
实体类创建注意
2009-10-10 20:55 1075今天在做项目的时候发现不能创建EntityManage ... -
EJB3 QL查询
2009-10-10 12:27 1241http://www.diybl.com/course/3_p ... -
CheckBox单选
2009-09-01 08:06 7197http://www.cnblogs.com/mextb1 ... -
[JSP]读取客户端文件
2009-08-27 12:27 2876http://hi.baidu.com/fableking/b ... -
tomcat + ssi
2009-08-03 12:43 2062在目前的Tomcat中,shtml默认是不支持的,需要进行一定 ... -
远程调试Tomcat
2009-07-16 20:15 954http://hi.baidu.com/flierssp/bl ... -
dwr中的异常处理
2009-07-15 20:22 3867一天一位老兄问我,我用的dwr怎么没有包装异常,以前我通过包装 ... -
Log4j使用总结
2009-07-14 16:36 1097收藏: http://kdboy.iteye.com/blog ... -
打造自己的单元测试容器——Junit Runner扩展详解
2009-07-12 10:22 2101http://rdc.taobao.com/blog/arch ... -
myeclipse不能编译、有错误不提示问题解决
2009-07-09 22:36 9640myeclipse7.5太庞大了,安装也太慢了,而且有好多看不 ... -
MyEclipse-7.5.0版注册码破解及激活操作
2009-07-09 22:30 9212http://blog.csdn.net/login8226/ ... -
Hibernate不同数据库的连接及SQL方言
2009-04-09 16:54 1191<!--MySql 驱动程序 eg. mysql-con ... -
初试Grails和Oracle的配置
2009-04-09 16:53 2005在听说过Grails很久后,终于开始了自己的Grails之旅, ... -
js中option操作
2009-03-26 15:31 3687<html> <head> ...
相关推荐
spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务
Spring2.5实现事务管理(本地事务、分布式事务).doc
Spring2.5+hibernate搞定分布式事务Spring2.5+hibernate搞定分Spring2.5+hibernate搞定分布式事务布式事务 第三部分
Spring2.5和Hibernate3集成 采用声明式事务 1.声明式事务的配置 * 配置sessionFactory * 配置事务管理器 * 配置事务的传播特性 * 配置哪些类哪些方法使用事务 2.编写业务逻辑方法 * 继承...
13) spring-mock.jar需spring-core.jar,spring-beans.jar,spring-dao.jar,spring-context.jar,spring-jdbc.jarspring2.0和spring2.5及以上版本的jar包区别Spring 2.5的Jar打包 在Spring 2.5中, Spring Web MVC...
spring2.5 + hibernate3.3 声明式事务 和所需jar包,spring2.5 + hibernate3.3 声明式事务 和所需jar包,spring2.5 + hibernate3.3 声明式事务 和所需jar包,
有很多新手不会分离spring的包而...吾将spring2.5的包分离出来欲给一些人以方便。只需下载该包添加到项目中引用即可,如果单独用spring管理事务,记住用JdbcTemplate来获取数据源对象。 再附xml配置文件一个,以供参考
Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。Spring提供了全功能的 MVC framework, 以及透明集成AOP到你...
struts2.2.3+spring2.5+hibernate3.2事务 有所用到的JAR
NULL 博文链接:https://zw7534313.iteye.com/blog/421679
2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...
spring2.5学习PPT 传智博客 01_全面阐释Spring及其各项功能 02_搭建与测试Spring的开发环境 03_编码剖析Spring管理Bean的原理 04_Spring的三种实例化Bean的方式 05_配置Spring管理的bean的作用域 06_Spring...
Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。Spring提供了全功能的 MVC framework, 以及透明集成AOP到你...
本实例是一个Spring与Hibernate结合的例子,很好地展示了用Spring的Ioc容器来灵活地定义Bean实现DAO和使用Spring的AOP实现事务管理。
基于 Spring2.5.6 包含Spring2.5中的信赖注入、AOP、事务管理等较全面的内部。
<br>新发布的Spring2.5继续坚持了这个发展趋向,特别是为那些使用Java 5或更新版本java的开发人员提供了进一步简化而强大的新特性。这些新特性包括:注解驱动的依赖性注入(annotation-driven dependency ...
这是Spring2.5集成JPA的有关事务的例子,挺实用的哦!
这是一个spring2.5+hibernate3.1+struts1.2的搭建案例,主要是一个转帐的案例,通过spring添加事务
NULL 博文链接:https://ymgjava.iteye.com/blog/1117624