结合spring+hibernate与jdbc的事务
问题背景:我们是一家工作流公司,客户采购我们的产品后,将其嵌入其项目中。我们的工作流采用的是spring+hibernate的方式,客户项目则是jdbc直接进行数据库操作。
问题:客户在其数据库操作过程中需要调用我们的工作流接口,这样就需要将我们的工作流操作与他们的业务操作置于同一个事务中。我们的服务采用的都是spring的声明式事务,而客户采用的是对connection进行事务处理。如何保证事务的一致性?
想到的解决方案一:使用jta事务,用tomcat+jotm提供事务管理器。为什么一开始就想到要使用jta事务??实际上我们和客户都是使用的同一个数据库,为了方便,各自使用了不同的数据库连接方式,使用jta的话确实有bt的意思在里面。但是事实上是我们的第一反应都是jta。最后没有采用该方法的原因也很简单:我没有将jotm配置成功!汗一个。
想到的解决方案二:将客户的这些特定代码用spring管理起来。因为要修改客户部分代码,这个方案遭到了客户的强烈反对。于是放弃。
想到的解决方案三:客户数据库操作与我们的服务使用同一个数据库连接。然后编程处理事务。存在两种方式:一种是把客户的连接传给我们,另一种则是把我们的连接传给客户。第一种方式对我们的影响太大,所以最后决定采用后一种方式:从hibernate session中获取connection然后传递给客户。接下来查看一下HibernateTemplate的execute()方法,思路就很简单了:获取定义的sessionFactory-->创建一个新的session并打开-->将session与当前线程绑定-->给客户代码返回connection-->打开事务-->客户使用我们传递的connection进行数据库操作-->我们不带声明事务的服务操作 -->提交事务-->解除绑定。
实际要注意的地方是:1、将session与当前线程绑定使用的是TransactionSynchronizationManager.bindResource()方法,这样在HibernateTemplate里才能找到session;
2、我们的服务一定要把声明式事务彻底干掉,否则会有commit;
3、我们服务调用完毕后一定要flush session,否则客户代码不会感知数据库里的数据变化。
最终解决:使用了spring里常用的模板和回调。代码如下:
java 代码
- public Object execute(TransactionCallback callback) {
-
- SessionFactory sessionFactory = (SessionFactory) Framework.getEngine()
- .getContainer().getComponent("sessionFactory");
-
- logger.debug("Opening single Hibernate Session in TransactionTemplate");
- Session session = getSession(sessionFactory);
-
- TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
-
- Connection conn = session.connection();
- Object result = null;
- Transaction transaction = null;
- try {
-
- transaction = session.beginTransaction();
- try {
- result = callback.doInTransaction(conn);
- }
- catch (RuntimeException ex) {
- doRollback(session, transaction);
- throw ex;
- }
- catch (Error err) {
- doRollback(session, transaction);
- throw err;
- }
-
- transaction.commit();
- } catch (WorkflowException e) {
- logger.error("数据库操作失败,事务回滚也失败!");
- throw e;
- } catch (RuntimeException ex) {
- logger.error("数据库操作失败,事务被回滚!");
- throw ex;
- } catch (Error err) {
- logger.error("数据库操作失败,事务被回滚!");
- throw err;
- } finally {
-
- TransactionSynchronizationManager.unbindResource(sessionFactory);
- doClose(session);
- }
- return result;
- }
客户伪代码:
java 代码
- public void methodA(){
- TransactionTemplate transactionTemplate=new TransactionTemplate();
- transactionTemplate.execute(new TransactionCallback(){
- public Object doInTransaction(Connection conn) {
-
- client.method1("1");
-
- our.method2();
-
- client.method3("l");
- return null;
- }
- });
- }
分享到:
相关推荐
12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...
事务处理也交由Spring去管理。 压缩文件中不包含Jar文件(由于全部的Jar将近12M,不能全部上传),所用到的Jar目录为,工程中再也不会出现由于MyEclipse自动整合而出现的大量Jar文件 : Java代码 1. //如果不用,...
前几天搞 Spring + Hibernate + Struts 事务配置 ,网上找了好多资料,不过好无语,大多都是 Ctrl + V,浪费俺的宝贵时间 现在我总结配出一套,给大家参考参考,可能有不足,请大家多多交流。 附:内有弹出...
两个项目,一个项目是基于spring jdbc实现的分布式事务,一个是基于spring hibernate的分布式事务,hibernate项目里的applicationContext2.xml是基于mysql和mssql, applicationContext3.xml基于两个mssql, ...
struts hibernate dwr 与Spring完全结合,实现用户列表、信息增、删、改、查、维护时用户重名提示等功能,还包括页面自动转码设置(web.xml),Hibernate管理服务按Bean名称拦截并进行Spring事务管理,完全由Spring...
12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...
12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...
本案例主要是分别实现Spring与jdbc和hibernate结合的事务控制,如果该案例有出入的地方,请给我留言,我们一起交流
spring声明式事务管理+jdbc+连接池 包内为代码,下载可直接执行。 一直用s2sh,感觉hibernate不好用,所以写了一个spring声明式事务管理+jdbc+连接池。
spring3.2+strut2+hibernate4 注解方式。 spring.xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
spring-jdbc-4.0.0.RELEASE.jar 对Spring 对JDBC 数据访问进行封装的所有类 spring-orm-4.0.0.RELEASE.jar Spring对DAO特性集进行了扩展 spring-tx-4.0.0.RELEASE.jar 事务相关的类 spring-web-4.0.0.RELEASE.jar ...
AJAX的支持等)、Spring(Ioc容器、装配Java Bean、Jdbc和Hibernate模板、事务管理、Spring AOP等)以及 Hibernate(会话、映射、标准查询API、HQL、事务管理、锁等)。除此之外,《Java Web开发技术大全:JSP+...
AJAX的支持等)、Spring(Ioc容器、装配Java Bean、Jdbc和Hibernate模板、事务管理、Spring AOP等)以及 Hibernate(会话、映射、标准查询API、HQL、事务管理、锁等)。除此之外,《Java Web开发技术大全:JSP+...
这是一个Dynamic Web Project,主要使用hibernate和spring框架,其中事务管理使用的是注解。 hibernate的版本:hibernate-distribution-3.6.6.Final; spring的版本:spring-framework-3.1.0.M2 。 注意:此项目没有...
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <value>com.org.entity</value> <prop key="hibernate....
第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到ORM框架的混用和DAO层设计的知识。 第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及...
实例详解Spring JDBC事务管理.doc 实例详解Spring JDBC事务管理.doc
通过spring存blob和clob数据到sybase数据库中,压缩包里包含了三种方式,(1)spring+hibernate,切面事务(aop),存lob数据,(2)spring+hibernate存lob数据,(3)spring+jdbc存lob数据。
AJAX的支持等)、Spring(Ioc容器、装配Java Bean、Jdbc和Hibernate模板、事务管理、Spring AOP等)以及 Hibernate(会话、映射、标准查询API、HQL、事务管理、锁等)。除此之外,《Java Web开发技术大全:JSP+...