最近使用JSF+Spring+OpenJPA框架开发,但是在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用JPA内部的双向关联,造成各实体内部关联过多,从而影响所有的操作,因此怀疑是因为JPA的关联关系所致。但是去掉关联关系后的效果不显著。
查找spring的相关配置,发现原来关于“transactionAttributes”有问题。原来的配置如下:
〈bean id=“baseTxProxy” lazy-init=“true”class=“org.springframework.transaction.interceptor.TransactionProxyFactoryBean” scope=“singleton” abstract=“true”〉
〈property name=“transactionManager”〉
〈ref local=“transactionManager” /〉
〈/property〉
〈property name=“transactionAttributes”〉
〈props〉
〈prop key=“register*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“trade*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“cancel*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“save*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“exe*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“add*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“persist*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“remove*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“del*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“update*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“gen*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“finish*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“get*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
〈prop key=“find*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
〈prop key=“query*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
〈prop key=“select*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
〈prop key=“is*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
〈/props〉
〈/property〉
〈/bean〉
使用上述配置,在JPA打出的日志中显示每次查询时都要进行更新操作,查阅相关spring 的资料后发现transactionAttributes的各种属性的意义如下:
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
当前所有的事务都使用“PROPAGATION_REQUIRED”属性值,并且控制事务的操作权限为只读,以保证查询时不会更新数据。根据上述定义 “PROPAGATION_REQUIRED”属性会造成为所有的操作都创建事务,从而会出现JPA的日志中查询时也会进行更新操作的现象,也就造成了效率的低下。将所有查询的操作改成事务类型为“PROPAGATION_NEVER”(不使用事务),则查询效率立即提升,但是此时担心一个问题:比如在一个saveXXX()的方法中,如果方法内部使用更新、查询、再更新的操作流程,会不会造成调用查询时,由于上述配置造成的抛出异常。
另外,如果出现
〈
prop key="myMethod"〉
PROPAGATION_REQUIRED,readOnly,-Exception〈
/prop〉
这样的配置,其中:
-Exception表示有Exception抛出时,事务回滚. -代表回滚+就代表提交
readonly 就是read only, 设置操作权限为只读,一般用于查询的方法,优化作用.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alex197963/archive/2009/08/11/4433531.aspx
分享到:
相关推荐
在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理应用中的事务。Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何...
### Spring中事务的传播属性详解 #### 一、引言 在使用Spring框架进行应用程序开发时,事务管理是一项非常重要的特性。Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理因其...
在Spring框架中,事务管理是核心特性之一,它使得开发者能够在多操作数据库时保持数据的一致性和完整性。本文将深入探讨Spring事务管理的源码,理解其背后的实现机制。 首先,Spring事务管理有两种主要模式:编程式...
Spring声明式事务管理是Spring框架的核心特性之一,它允许开发者在不侵入业务代码的情况下,对应用程序的事务进行管理。这种方式极大地提高了代码的可维护性和灵活性。以下是对Spring声明式事务配置的详细说明: 1....
在上面的例子中,`saveUser`方法会在一个事务中执行,如果发生异常,整个事务会被回滚,确保数据的一致性。 总结一下,`Spring Hibernate事务实例`涵盖了以下核心知识点: 1. Spring框架的声明式事务管理:通过`...
若出现异常,Spring会自动回滚事务,以保证数据的一致性。 4. **事务隔离**:Spring支持多种事务隔离级别,如READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE,不同的隔离级别能防止特定类型的...
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务...
这段代码表明`saveUser`方法将在一个事务中执行,如果发生异常,事务将被回滚。 总的来说,Spring 2.0的事务处理机制是其核心功能之一,它通过声明式和编程式的事务管理方式为开发者提供了极大的便利。理解并熟练...
在本文中,我们将深入探讨Spring框架中的事务管理。Spring是一个广泛应用的Java企业级应用开发框架,它提供了强大的事务管理功能,使得开发者可以方便地控制事务的边界,保证数据的一致性和完整性。 首先,理解事务...
Spring默认会在出现未捕获的运行时异常时回滚事务。通过`rollbackFor`和`noRollbackFor`属性,我们可以自定义哪些异常应触发回滚,哪些异常不应触发回滚。 ### 5. 性能考虑 虽然基于注解的事务管理简化了开发,但...
在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理事务。本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将...
### 深入理解Spring的事务管理机制 #### 一、事务的基本原理 Spring框架的事务管理机制是在Java开发环境中非常重要的一个组成部分,它能够帮助开发者简化事务处理的复杂度,提高应用程序的一致性和可靠性。Spring...
在上述例子中,`createUser`方法被标记为`@Transactional`,这意味着如果方法内部抛出未检查异常(继承自`RuntimeException`的异常)或者受检异常(如`IOException`),Spring会自动回滚事务。如果没有异常,事务将...
当发生异常时,Spring会根据回滚规则判断是否需要回滚事务。在实际开发中,理解这部分源码有助于我们更深入地掌握Spring事务管理的工作原理。 至于工具,开发者可以使用诸如IntelliJ IDEA这样的IDE,其中集成的调试...
当发生未检查异常(继承自RuntimeException的异常)时,Spring会自动回滚事务;而对于受检查异常(非RuntimeException),如果不显式声明需要回滚,Spring将提交事务。理解这一点对于避免不必要的数据损坏至关重要。...
如果子事务内部发生异常,Spring会回滚到这个保存点,而不是整个父事务。 3. **异常处理**:在Spring中,只有在未捕获的异常导致方法退出时,事务才会自动回滚。因此,即使在子事务中抛出并捕获了异常,只要不重新...
Spring事务原理和配置 Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两...
在讨论了代理模式、异常分类、方法权限后,文章还提到了Spring事务管理中事务的传播机制和隔离机制。事务的传播机制定义了事务的行为,例如是否在当前事务中执行或者创建一个新的事务。隔离机制定义了事务之间的隔离...
Spring定义了七种事务传播行为,如PROPAGATION_REQUIRED(默认行为,新建事务或加入当前事务)、PROPAGATION_SUPPORTS(如果存在事务,则加入,否则无需事务)、PROPAGATION_MANDATORY(必须在现有事务中运行,否则...
此外,Spring 还提供了事务回滚规则,允许基于异常类型或异常实例来决定是否回滚事务,增强了事务处理的灵活性。 Spring AOP 用于实现事务管理服务,它通过代理模式在方法调用前后插入事务处理代码,无需修改原有...