`

【转】Hibernate 事务与JDBC 事务同时使用注意事项

阅读更多

当一个service ,既调用了用Hibernate技术实现的DAO,又调用了用JDBC技术实现的DAO时,service需要怎样配置事务?当一个service 调用了其他service,而两个service所配置的事务不同,我们应该怎么处理?

本文通过4个测试,描述了在配置JDBC事务和Hibernate事务混用的情况下,应该注意的事情。写的不好,请大家多多帮助。
我们先进行一个测试,测试结果如下:

1. service 配置baseTxProxy(HibernateTransactionManager) Hibernate和JDBC实现的DAO没有配置事务(没有出现异常)。

2.service配置JDBCTxDAOProxy (DataSourceTransactionManager) Hibernate和JDBC实现的DAO没有配置事务(没有出现异常)。

3.service配置baseTxProxy(HibernateTransactionManager)Hibernate和JDBC实现的DAO配置了对应实现的事务(没有异常)。

 

4.service配置JDBCTxDAOProxy (DataSourceTransactionManager) Hibernate和JDBC实现的DAO配置了对应实现的事务(抛出异常)
下面对这个测试进行进一步的说明:

1. service 配置baseTxProxy(HibernateTransactionManager) Hibernate和JDBC实现的DAO 没有配置事务:
正常:

   查询功能正常,修改、删除功能正常。系统不抛出异常。
问题:

   当Hinernat实现的DAO调用save方法添加一条记录时,用JDBC实现的DAO读取不到数据。

Java代码 System.out.println("hibernate delete");  zxmTestHiDAO.deleteDB();  System.out.println("hibernate insert");  zxmTestHiDAO.saveDB();  System.out.println("hibernate read");  zxmTestHiDAO.readDB();  System.out.println("hibernate delete"); zxmTestHiDAO.deleteDB();System.out.println("hibernate insert"); zxmTestHiDAO.saveDB();System.out.println("hibernate read"); zxmTestHiDAO.readDB();

问题原因及解决办法:

  当调用Hibernate的save方法时,Hibernate并没有提交数据,而是放入Hibernate缓存中,在提交事务前,一起提交数据,这时,JDBC读取数据库,是得不到数据的,及时他们是配置在一个事务中的。

  为了让JDBC能能够读取到Hibernate添加的数据,我们需要调用Hibernate提供的flush方法。这样,JDBC就能够读取到了。

  当Hibernate调用delete和update时,会自动调用flush方法

2. service 配置JDBCTxDAOProxy (DataSourceTransactionManager) Hibernate和JDBC实现的DAO 没有配置事务:
正常:

   查询、JDBC调用正常。系统不抛出异常。
问题:

   hibernate不能提交事务。
问题原因及解决办法:

  没有好的解决办法,不建议这么配置。

3.service 配置baseTxProxy(HibernateTransactionManager)  Hibernate和JDBC实现的DAO 配置了对应实现的事务:
测试结果与测试1相同。

4.service 配置JDBCTxDAOProxy (DataSourceTransactionManager) Hibernate和JDBC实现的DAO 配置了对应实现的事务:
问题:

系统抛出如下异常,说明配置错误,不能这样使用。

Pre-bound JDBC connection found - HibernateTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single HibernateTransactionManager for all transactions on a single DataSource, no matter whether Hibernate or JDBC access.
结论:

根据以上测试结果,建议使用第1、3种方法。

使用时,要特别注意Hinernate 添加了数据,JDBC要读取这个数据时,要调用Hibernate 的flush方法

分享到:
评论

相关推荐

    SpringAOP整合Hibernate并使用事务

    将Spring与Hibernate整合并使用事务管理,能进一步提升应用的稳定性和效率。下面我们将详细讲解如何进行Spring AOP整合Hibernate以及如何在其中使用事务。 1. **Spring AOP简介** 面向切面编程(AOP)是Spring框架...

    hibernate5--2.数据持久化及事务

    通过以上内容,我们了解了Hibernate 5在数据持久化和事务管理方面的基本操作和注意事项。在实际项目中,结合事务的隔离级别、锁机制以及适当的事务策略,我们可以构建出高效、稳定的数据访问层。

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    - `PlatformTransactionManager`:事务管理器接口,具体实现有`DataSourceTransactionManager`(适用于JDBC事务)和`HibernateTransactionManager`(适用于Hibernate事务)。 - `@Transactional`:用于标记事务...

    spring学习之八--Hibernate编程式事务

    通过以上讨论,我们了解到在Spring中使用Hibernate进行编程式事务管理的基本概念、使用方法以及注意事项。这有助于我们在开发过程中更好地控制事务,确保数据的一致性和完整性。同时,理解声明式和编程式事务管理的...

    SpringBoot事务和Spring事务详讲

    本文将详细介绍 Spring 和 Spring Boot 中事务的使用方法及其注意事项。 #### 二、事务的基本概念 在讨论 Spring 事务之前,我们先从日常生活中的一个常见场景——取钱说起。当你从 ATM 机上取款时,这一过程可以...

    Hibernate中使用Access

    6. **优化与注意事项**: 由于Access的性能和并发能力相对较弱,所以在使用Hibernate与Access结合时,需要注意以下几点: - 尽量减少数据库连接的创建和关闭,因为频繁的连接操作会降低效率。 - 避免大量数据的读写...

    Spring声明式事务配置管理方法

    通常,对于Hibernate,我们会使用`HibernateTransactionManager`,因为它与Hibernate ORM集成良好。配置如下: ```xml <bean id="transactionManager" class="org.springframework.orm.hibernate3....

    HibernateHQL级联注意事项[归类].pdf

    5. 注意事项 - 在编写HQL级联查询时,需要理解级联操作的类型,如`save-update`、`fetch`、`all-delete-orphan`等,它们会影响对象的持久化行为。 - 考虑性能影响,过多的级联查询可能导致大量的数据库交互,可能...

    关于hibernate的批处理

    11. **性能优化注意事项**: 在实际应用中,应结合业务场景调整批处理大小,过大可能导致内存溢出,过小则可能无法充分利用数据库的批处理功能。 12. **监控与调优**: 使用数据库日志、监控工具(如JProfiler)或...

    Hibernate 原生通用DAO

    `readme.txt`可能包含了使用该通用DAO的说明和注意事项;而`HibDao`可能是实现了上述功能的Java源代码,包含了具体的DAO接口和实现类。 使用这类通用DAO的优点在于减少了代码冗余,提高了代码复用性,使得开发人员...

    hibernate

    - **注意事项**:`Session` 不是线程安全的,多个线程共享一个 `Session` 可能会导致数据混乱。可以使用 `ThreadLocal` 变量来解决这个问题,确保每个线程都有自己的 `Session` 实例。 #### 三、使用 Hibernate 的...

    最简单Hibernate工程代码

    【压缩包子文件的文件名称列表】中提到的"注意.txt"可能包含了使用和运行该项目的注意事项,例如环境配置、依赖库的安装、运行步骤等。而"hibernate"可能是一个文件夹,里面包含了Hibernate的配置文件、实体类、DAO...

    JDBC经典练习题

    通过上述JDBC的经典练习,可以深入理解数据库操作的基本流程和注意事项,为后续的数据库开发工作打下坚实的基础。不断实践和学习,你将能够更熟练地运用JDBC进行数据库交互。祝你在学习过程中收获满满,早日成为...

    Hibernate Spring MySQL项目配置图解

    这是本人上课过程中为学生讲解hibernate、spring和mysql开发简单项目的截图汇集,大家需要先自己完成数据库以及JDBC数据源的配置,之后按照该截图的顺序就能完成一个最简单的支持数据库事务处理的SH系统,(如果使用...

    HIBERNATE4开发文档,HIBERNATE4的变化

    - 使用Spring管理Hibernate事务时,无论是注解方式还是XML配置方式,都应使用`HibernateTransactionManager`。示例如下: ```xml <bean id="txManager" class="org.springframework.orm.hibernate4....

    hibernate连接Access应用项目例子

    在本项目中,“hibernate连接Access应用项目例子”展示了如何使用Hibernate ORM框架与Microsoft Access数据库进行集成,实现数据的增、删、改、查(CRUD)操作。Hibernate是Java开发中的一个流行ORM(对象关系映射)...

    hibernate-release-4.2.12.Final libs

    - 事务管理:Hibernate支持JTA和JDBC事务管理,确保数据一致性。 - 分布式应用:与Spring框架结合,实现依赖注入,便于在大型项目中管理和部署。 5. 版本改进与注意事项: Hibernate 4.2.12.Final修复了一些已知...

    Hibernate相关资料

    - 分布式环境下的应用:在多线程、分布式系统中使用Hibernate的注意事项。 - Spring与Hibernate的整合:Spring框架中如何集成Hibernate,实现声明式事务管理。 通过学习这个压缩包中的资料,无论是初学者还是经验...

Global site tag (gtag.js) - Google Analytics