`
lsy
  • 浏览: 122983 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

对Spring JpaTransactionManager的误解

阅读更多
在以前项目中验证Hibernate实现JPA规范的时候发现虽然在AOP配置成只读的read only的模式,但对数据库的更新操作依旧能够执行提交,如配置文件定义为:

<tx:method name="get*" read-only="true"/>

逻辑层代码实现如下:

  public User getUser(User o) {
        return this.entityManager.merge(o);
    }

以前将问题定位为JpaTransactionManager没有对readonly进行判断,而如果换作HibernateTransactionManager则会将事务设置为MANUAL,如果不显示的提交不会修改数据库。因此误认为是JpaTransactionManager的一个BUG,因重新集成实现了一个子类:

public class MyJpaTransactionManager extends JpaTransactionManager{
protected transient Log logger = LogFactory.getLog(getClass());
@Override
protected void doCommit(DefaultTransactionStatus status) {
  if(status.isReadOnly()){
   logger.info("This a read only transaction.");
  }
  else{
   super.doCommit(status);
  }
}
}

后来无意浏览类似问题的解决方法时,发现国外有人也提出过类似的问题,而且得到了Juergen Hoeller本人的答复,原地址:

https://jira.springsource.org/browse/SPR-8959

奇怪的是Juergen Hoeller 并不当作一个BUG,事务read only本身仅仅是告诉业务应用有一个对数据库只读访问的暗示,这里存在可优化的地方,但若该事务出现了更新数据的操作,并不会阻止这个事务的提交。因此,重新翻出以前的代码逐行调试,寻找其中的道理。终于明白,原来对于一个事务(无论是否定义为只读)只有两种可能,要么提交,要么回滚。不管这个事务有没有提交,这个事务都会存在于应用之中。因此,若按照之前的误解,实现了上述错误的子类,那么很有可能在大并发请求数中存在大量未释放的连接,从而导致很多未知的性能瓶颈。

对框架的验证及其重要,发现问题时应该以SR的形式提交社区探讨,确认解决方案,并做详细的POC验证测试。
分享到:
评论
1 楼 fanny52o 2014-02-07  

相关推荐

    Spring Data JPA中文文档[1.4.3]_springdatajpa_erlang_waitxpf_

    10. **Elasticsearch 集成**:虽然不是 Spring Data JPA 的核心功能,但 Spring Data 项目包含了对 Elasticsearch 的支持,使得存储和检索大数据变得更加容易。 通过阅读《Spring Data JPA 中文文档[1.4.3]》PDF ...

    spring jpa

    在Spring JPA中,你可以通过定义Repository接口来实现对数据库的操作,而Spring会自动帮你完成数据访问的大部分工作。 1. **什么是JPA?** Java Persistence API (JPA) 是Java平台上的一个标准,它定义了如何在Java...

    maven+springmvc+springjpa+hibernate

    接下来,**SpringJPA**是Spring框架对Java Persistence API(JPA)的封装,它简化了数据库操作。JPA是一种ORM(对象关系映射)规范,允许开发者使用面向对象的方式来处理数据库操作,而无需编写SQL语句。SpringJPA...

    Spring Data JPA 笔记

    Spring Data JPA 是一个强大的框架,它简化了Java应用程序与数据库之间的交互,是Spring生态中的重要组成部分。通过使用Spring Data JPA,开发者可以避免编写大量的JPA(Java Persistence API)和SQL代码,专注于...

    spring注解+spring data jpa文档+JPA文档.rar

    Spring框架的核心特性包括依赖注入(DI)和面向切面编程(AOP),并且它还提供了对数据库操作的支持,这主要通过Spring Data JPA和Java Persistence API(JPA)实现。 Spring注解是Spring框架中的一大特色,它极大...

    Struts2 Spring Jpa 配置测试

    Struts2、Spring和JPA是Java开发中常用的三大框架,它们在企业级应用开发中发挥着关键作用。Struts2作为MVC框架,负责控制应用程序的流程;Spring框架则是一个全面的后端解决方案,提供了依赖注入(DI)、面向切面...

    springjpa 和 spring多视图配置实例

    本实例探讨的是如何在Spring环境中整合Spring MVC、Spring Data JPA以及使用Freemarker或JSON作为多视图配置。让我们深入理解这些技术及其相互作用。 首先,Spring MVC是Spring框架的一部分,专门用于构建Web应用...

    spring mvc spring spring jpa集成

    Spring JPA(Java Persistence API)是Spring对Java EE中的JPA规范的封装,用于简化数据库操作。它提供了一种声明式的方式来管理实体和数据库之间的映射,以及CRUD操作。Spring Data JPA进一步扩展了Spring JPA,...

    Spring JPA Example

    **Spring JPA 示例详解** Spring JPA(Java Persistence API)是Spring框架的一部分,它提供了一个简单、方便的方式来处理数据库操作。这个示例将深入探讨如何在Spring应用中使用JPA来实现数据持久化。 首先,我们...

    SpringMVC+Spring+SpringDataJPA+Hibernate整合登录的效果

    这是整合SpringMVC+Spring+SpringDataJPA+Hibernate简单的实现登录的功能,用的是mysql数据库,这是一个web Project 如果你用的是JavaEE6那么你要注意bean-validator.jar和weld-osgi-bundle.jar与slf4j的jar包冲突。...

    spring jpa操作数据库 级联数据 hibernate

    Spring JPA是Spring对Java Persistence API的一个封装,它提供了声明式持久化,使得开发者可以更方便地管理数据库操作。通过使用JPA,我们可以在Java对象和数据库表之间建立映射,无需编写大量的SQL代码。Spring JPA...

    Spring Data JPA从入门到精通

    3. **Spring Data JPA概述**:Spring Data JPA是Spring对JPA的扩展,它提供了自动化的数据访问层,包括查询方法的自动实现、Repository接口的定义以及定制化查询等功能。 4. **Repository接口**:Spring Data JPA的...

    Spring JPA 配置类包集合 方便大家使用

    Spring JPA,全称为Spring Data JPA,是Spring框架的一部分,专门用于简化Java持久层编程,尤其是与关系型数据库的交互。它建立在Java Persistence API(JPA)之上,提供了更高级别的抽象,使得开发者可以更加专注于...

    spring学习:spring data jpa

    3. 配置JPA和事务管理:声明`LocalContainerEntityManagerFactoryBean`以创建EntityManagerFactory,配置`JpaTransactionManager`作为事务管理器。 4. 定义实体类:使用JPA注解(如@Entity、@Table、@Id等)来描述...

    2017 spring data jpa+spring4.2+springmvc+hibernate4.3 maven环境intellij idea增删改查实例

    Spring 4.2是Spring框架的一个版本,它增强了对Java 8的支持,包括日期和时间API的改进,以及对反应式编程的支持。此外,Spring 4.2还引入了更多优化,如更好的类型安全的事件处理和HTTP/2协议支持。Spring框架作为...

    spring boot jpa security

    Spring Data JPA是Spring框架的一个模块,提供了对JPA的高级支持,包括自动配置、查询生成和仓库抽象层,使得数据库操作更加便捷。 Spring Security是一个功能强大的安全框架,用于保护基于Spring的应用程序。它...

    spring-data-jpa-2.0.9.RELEASE-API文档-中文版.zip

    赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...

    Spring Data JPA的优点和难点.pdf

    Spring Data JPA是Spring生态中的一个强大ORM框架,它极大地提高了Java开发者在处理数据库操作时的效率。Spring Data JPA的主要优点在于其高度的开发效率、成熟的语法结构以及与Spring框架的紧密集成。 1. **开发...

    springdatajpa 包括jar包

    Spring Data JPA是Spring框架的一个模块,专门用于简化Java持久层的开发,它提供了一种声明式的方式来处理数据访问,极大地减少了我们编写DAO层代码的工作量。本篇将深入探讨Spring Data JPA与Struts2、Spring框架的...

Global site tag (gtag.js) - Google Analytics