在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用JPA内部的双向关联,造成各实体内部关联过多,从而影响所有的操作,因此怀疑是因为JPA的关联关系所致。但是去掉关联关系后的效果不显著。
配置问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<bean id= "baseTransactionProxy" class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init= "true" abstract = "true" > <property name= "transactionManager" > <ref bean= "transactionManager" /> </property> <props> <prop key= "sav*" >PROPAGATION_REQUIRED</prop> <prop key= "update*" >PROPAGATION_REQUIRED</prop> <prop key= "delete*" >PROPAGATION_REQUIRED</prop> <prop key= "get*" >PROPAGATION_REQUIRED,readOnly</prop> <prop key= "find*" >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类似的操作。 |
原文链接:https://www.2cto.com/kf/201612/577472.html