结合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;
- }
- });
- }
分享到:
相关推荐
Spring框架则是一个全面的企业级应用开发平台,它不仅包含Spring MVC,还提供了依赖注入(DI)、AOP(面向切面编程)、事务管理、JDBC抽象、缓存、任务调度等多个核心功能。在全注解开发中,我们可以使用@Autowired...
Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...
Spring的JDBC模板或者Hibernate的Session接口可以用来与MySQL进行交互。 在实际开发中,这五个组件协同工作,形成一个完整的三层架构:表现层(JSP)、业务层(Spring)和数据访问层(Hibernate)。Struts2接收用户...
Spring作为一个全面的开发框架,提供了依赖注入、AOP(面向切面编程)、事务管理等核心功能,而Hibernate则是一个优秀的对象关系映射(ORM)框架,使得Java开发者可以更加方便地操作数据库。在本案例中,我们将探讨...
【JSF+Spring+Hibernate整合开发】 JSF (JavaServer Faces)、Spring 和 Hibernate 是 Java 开发中的三大核心技术,常用于构建企业级的 Web 应用程序。它们各自扮演着不同的角色,共同构建了一个强大的后端架构。 1...
Hibernate通过JDBC与Oracle进行通信,执行CRUD(创建、读取、更新、删除)操作。 综上所述,这个项目展示了如何利用SpringMVC、Spring、Hibernate和Oracle这四者协同工作,实现一个完整的图书管理系统。SpringMVC...
Hibernate 则是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,将 Java 对象与数据库表进行映射,使得开发者可以使用对象而不是 SQL 来操作数据库。 Spring 和 Hibernate 的整合主要涉及到以下几个方面:...
ZK、Spring和Hibernate是Java开发中的三大重要框架,它们分别在用户界面、依赖注入与事务管理、持久层操作方面发挥着关键作用。将这三者进行整合,可以构建出高效、稳定且易于维护的企业级应用。以下是对这三者整合...
Spring还提供了大量模块,如Spring MVC、Spring JDBC和Spring ORM,其中Spring ORM与Hibernate整合,使得ORM操作更加方便。 Hibernate作为ORM框架,使得Java开发者可以使用面向对象的方式来操作数据库,而无需编写...
它支持JDBC,并可以与Spring整合,实现事务管理和数据源配置。 JDBC(Java Database Connectivity)是Java标准的数据库连接接口,允许开发者直接操作数据库。在Hibernate等ORM框架下,JDBC作为底层支持,用于执行...
5. **jackson-all-1.8.2.jar**:Jackson是一个流行的JSON处理库,用于JSON序列化和反序列化,Spring MVC可以与Jackson结合,方便地处理HTTP请求和响应中的JSON数据。 6. **freemarker.jar**:FreeMarker是一个模板...
本实例将深入探讨如何结合Spring的注解声明式事务管理与Hibernate的数据访问技术,构建一个完整的事务处理系统。 Spring框架以其灵活的依赖注入(DI)和面向切面编程(AOP)闻名,它允许开发者将事务管理从业务逻辑...
标题 "spring+hibernate+struts" 指涉的是一个经典的Java Web开发框架组合,也被称为SSH(Spring、Struts和Hibernate)三位一体。这个组合在2000年代中期到后期非常流行,用于构建企业级应用。下面将详细阐述这三个...
【标题】"java+Spring+Hibernate整合的企业OA源码"所代表的是一个使用Java编程语言,结合Spring框架和Hibernate持久层框架实现的企业级办公自动化(Office Automation,简称OA)系统的源代码。这样的系统通常用于...
Spring与Hibernate的结合,利用Spring的Transaction API进行事务管理,可以确保数据操作的完整性和一致性。 在SSH整合中,Struts 2负责控制层,Spring作为业务层的核心,处理依赖注入、事务管理和服务调用,而...
Struts1、Spring和Hibernate是Java Web开发中的三个重要框架,它们各自负责应用程序的不同层面:Struts1专注于表现层管理,Spring提供了强大的依赖注入和事务管理功能,而Hibernate则是持久层解决方案,简化了数据库...
4. **整合Spring和Hibernate**:在Spring配置中,通过`<bean>`标签实例化SessionFactory,并使用`<tx:annotation-driven>`启用基于注解的事务管理。在业务逻辑类中,通过@Autowired注解注入所需的DAO或Service层组件...
总的来说,"Struts+Spring+Hibernate+WebService"的集成架构是Java Web开发中常见的解决方案,它结合了MVC框架、企业级服务管理、ORM工具和跨平台通信技术,为复杂的企业应用提供了强大的支撑。这种架构允许开发者...
Spring Framework 提供了一个全面的开发工具集,包括依赖注入、AOP(面向切面编程)、事务管理等,它支持多种持久化策略,如 JDBC、JPA 或 Hibernate。Hibernate 则是一个对象关系映射 (ORM) 工具,能够将 Java 类与...