posts - 241,  comments - 116,  trackbacks - 0
          最近碰到這個(gè)問(wèn)題,在使用spring提供的JpaTemplate進(jìn)行查詢時(shí),如果數(shù)據(jù)量超過(guò)100 條,查詢效率就會(huì)明顯降低。由于開(kāi)始時(shí)使用JPA內(nèi)部的雙向關(guān)聯(lián),造成各實(shí)體內(nèi)部關(guān)聯(lián)過(guò)多,從而影響所有的操作,因此懷疑是因?yàn)镴PA的關(guān)聯(lián)關(guān)系所致。但 是去掉關(guān)聯(lián)關(guān)系后的效果不顯著。

          查找spring的相關(guān)配置,發(fā)現(xiàn)原來(lái)關(guān)于“transactionAttributes”有問(wèn)題。原來(lái)的配置如下:

          <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          lazy-init="true" abstract="true">
          <property name="transactionManager">
          <ref bean="transactionManager" />
          </property>
          <property name="transactionAttributes">
          <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打出的日志中顯示每次查詢時(shí)都要進(jìn)行更新操作,查閱相關(guān)spring 的資料后發(fā)現(xiàn)transactionAttributes的各種屬性的意義,現(xiàn)把資料分享如下:

          PROPAGATION_REQUIRED--支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就新建一個(gè)事務(wù)。這是最常見(jiàn)的選擇。
          PROPAGATION_SUPPORTS--支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就以非事務(wù)方式執(zhí)行。
          PROPAGATION_MANDATORY--支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就拋出異常。
          PROPAGATION_REQUIRES_NEW--新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。
          PROPAGATION_NOT_SUPPORTED--以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
          PROPAGATION_NEVER--以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。
          PROPAGATION_NESTED--如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒(méi)有事務(wù),則進(jìn)行與PROPAGATION_REQUIRED類(lèi)似的操作。
          當(dāng)前所有的事務(wù)都使用“PROPAGATION_REQUIRED”屬性值,并且控制事務(wù)的操作權(quán)限為只讀,以保證查詢時(shí)不會(huì)更新數(shù)據(jù)。根據(jù)上述 定義 “PROPAGATION_REQUIRED”屬性會(huì)造成為所有的操作都創(chuàng)建事務(wù),從而會(huì)出現(xiàn)JPA的日志中查詢時(shí)也會(huì)進(jìn)行更新操作的現(xiàn)象,也就造成了效 率的低下。將所有查詢的操作改成事務(wù)類(lèi)型為“PROPAGATION_NEVER”(不使用事務(wù)),則查詢效率立即提升,但是此時(shí)擔(dān)心一個(gè)問(wèn)題:比如在一 個(gè)saveXXX()的方法中,如果方法內(nèi)部使用更新、查詢、再更新的操作流程,會(huì)不會(huì)造成調(diào)用查詢時(shí),由于上述配置造成的拋出異常。

          另外,如果出現(xiàn)

          〈prop key="myMethod"〉PROPAGATION_REQUIRED,readOnly,-Exception〈/prop〉
          這樣的配置,其中:

          -Exception表示有Exception拋出時(shí),事務(wù)回滾. -代表回滾+就代表提交

          readonly 就是read only, 設(shè)置操作權(quán)限為只讀,一般用于查詢的方法,優(yōu)化作用.
          posted on 2011-08-08 09:54 墻頭草 閱讀(11795) 評(píng)論(2)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          人人游戲網(wǎng) 軟件開(kāi)發(fā)網(wǎng) 貨運(yùn)專(zhuān)家
          主站蜘蛛池模板: 乌兰察布市| 洛川县| 大庆市| 丽江市| 金秀| 文登市| 亳州市| 大英县| 黔东| 手游| 三门县| 厦门市| 松滋市| 伊吾县| 正镶白旗| 济阳县| 封丘县| 新郑市| 徐州市| 辽阳县| 刚察县| 金沙县| 宜州市| 沙田区| 乐东| 揭阳市| 开封县| 西丰县| 织金县| 太原市| 英德市| 邢台县| 惠州市| 休宁县| 错那县| 禄劝| 清河县| 鄂伦春自治旗| 罗城| 耿马| 北川|