在以前项目中验证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验证测试。
分享到:
相关推荐
10. **Elasticsearch 集成**:虽然不是 Spring Data JPA 的核心功能,但 Spring Data 项目包含了对 Elasticsearch 的支持,使得存储和检索大数据变得更加容易。 通过阅读《Spring Data JPA 中文文档[1.4.3]》PDF ...
在Spring JPA中,你可以通过定义Repository接口来实现对数据库的操作,而Spring会自动帮你完成数据访问的大部分工作。 1. **什么是JPA?** Java Persistence API (JPA) 是Java平台上的一个标准,它定义了如何在Java...
接下来,**SpringJPA**是Spring框架对Java Persistence API(JPA)的封装,它简化了数据库操作。JPA是一种ORM(对象关系映射)规范,允许开发者使用面向对象的方式来处理数据库操作,而无需编写SQL语句。SpringJPA...
Spring Data JPA 是一个强大的框架,它简化了Java应用程序与数据库之间的交互,是Spring生态中的重要组成部分。通过使用Spring Data JPA,开发者可以避免编写大量的JPA(Java Persistence API)和SQL代码,专注于...
Spring框架的核心特性包括依赖注入(DI)和面向切面编程(AOP),并且它还提供了对数据库操作的支持,这主要通过Spring Data JPA和Java Persistence API(JPA)实现。 Spring注解是Spring框架中的一大特色,它极大...
Struts2、Spring和JPA是Java开发中常用的三大框架,它们在企业级应用开发中发挥着关键作用。Struts2作为MVC框架,负责控制应用程序的流程;Spring框架则是一个全面的后端解决方案,提供了依赖注入(DI)、面向切面...
本实例探讨的是如何在Spring环境中整合Spring MVC、Spring Data JPA以及使用Freemarker或JSON作为多视图配置。让我们深入理解这些技术及其相互作用。 首先,Spring MVC是Spring框架的一部分,专门用于构建Web应用...
Spring JPA(Java Persistence API)是Spring对Java EE中的JPA规范的封装,用于简化数据库操作。它提供了一种声明式的方式来管理实体和数据库之间的映射,以及CRUD操作。Spring Data JPA进一步扩展了Spring JPA,...
**Spring JPA 示例详解** Spring JPA(Java Persistence API)是Spring框架的一部分,它提供了一个简单、方便的方式来处理数据库操作。这个示例将深入探讨如何在Spring应用中使用JPA来实现数据持久化。 首先,我们...
这是整合SpringMVC+Spring+SpringDataJPA+Hibernate简单的实现登录的功能,用的是mysql数据库,这是一个web Project 如果你用的是JavaEE6那么你要注意bean-validator.jar和weld-osgi-bundle.jar与slf4j的jar包冲突。...
Spring JPA是Spring对Java Persistence API的一个封装,它提供了声明式持久化,使得开发者可以更方便地管理数据库操作。通过使用JPA,我们可以在Java对象和数据库表之间建立映射,无需编写大量的SQL代码。Spring JPA...
3. **Spring Data JPA概述**:Spring Data JPA是Spring对JPA的扩展,它提供了自动化的数据访问层,包括查询方法的自动实现、Repository接口的定义以及定制化查询等功能。 4. **Repository接口**:Spring Data JPA的...
Spring JPA,全称为Spring Data JPA,是Spring框架的一部分,专门用于简化Java持久层编程,尤其是与关系型数据库的交互。它建立在Java Persistence API(JPA)之上,提供了更高级别的抽象,使得开发者可以更加专注于...
3. 配置JPA和事务管理:声明`LocalContainerEntityManagerFactoryBean`以创建EntityManagerFactory,配置`JpaTransactionManager`作为事务管理器。 4. 定义实体类:使用JPA注解(如@Entity、@Table、@Id等)来描述...
Spring 4.2是Spring框架的一个版本,它增强了对Java 8的支持,包括日期和时间API的改进,以及对反应式编程的支持。此外,Spring 4.2还引入了更多优化,如更好的类型安全的事件处理和HTTP/2协议支持。Spring框架作为...
Spring Data JPA是Spring框架的一个模块,提供了对JPA的高级支持,包括自动配置、查询生成和仓库抽象层,使得数据库操作更加便捷。 Spring Security是一个功能强大的安全框架,用于保护基于Spring的应用程序。它...
赠送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是Spring生态中的一个强大ORM框架,它极大地提高了Java开发者在处理数据库操作时的效率。Spring Data JPA的主要优点在于其高度的开发效率、成熟的语法结构以及与Spring框架的紧密集成。 1. **开发...
Spring Data JPA是Spring框架的一个模块,专门用于简化Java持久层的开发,它提供了一种声明式的方式来处理数据访问,极大地减少了我们编写DAO层代码的工作量。本篇将深入探讨Spring Data JPA与Struts2、Spring框架的...