在使用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