HibernateTemplate通常是爲了加快開發效率,還有就是使用Hibernate的時候,更簡潔,更便利,而統一的聲明事務,又讓原本就已經很簡潔的Hibernate對事務的處理,大大簡化 但任何事務都有兩面性,在帶來大量便捷的同時,Hibernate也給咱們留下了一點小小的遺憾,好比衆所周知的,在處理大批量數據查詢的時候,Hibernate的查詢效率,是不盡人意的,有人作過測試,在高併發查詢的時候,hibernate的查詢效率,僅僅至關於使用jdbc效率7成左右,這對於對速度有着很高要求的互聯網應用來講,不能不說是悲劇。 儘管有存在有各類各樣的緩存解決方案,但仍是在高併發查詢下,讓人們對 hibernate的性能,捏了一把汗.同時,hibernate在查詢的時候,所帶來的n+1問題,也一直讓人所詬病. 進而在批量操做方面,好比在早期,在沒有使用jdbc3.0的batch update的時候,hibernate的批量刪除,是讓人很頭痛的, 甚至是一條記錄的刪除,也不能作到像jdbc同樣讓人滿意. 因此,在咱們的項目框架中,混合使用hibernate與jdbc,各自發揮各自的優點與長處,彌補對方的缺陷,提升系統的響應速度.可是須要注意的時, jdbcTemplate的HibernateTemplate混合使用的時候,要注意其混合事務的處理. 正如咱們之前的項目同樣,一開始在項目中使用的是JDBCTemplate,爲了提升開發效率決定採用Hibernate,可是發現Hibernate 在作批量操做時,效率不是很理想。 web
因此如今採用JDBCTemplate和Hibernate混用,這時有幾個注意事項。 spring
1.若是採用JDBCTemplate的部分只涉及到查詢,則可使用Hibernate的應用緩存,即二級緩存。 數據庫
2.若是採用JDBCTemplate的部分涉及到對數據庫的更新操做,即增,刪,改.則不能開啓Hibernate的二級緩存,若是系統有緩存的須要,我以爲能夠本身在邏輯層實現緩存.Java的緩存方案仍是不少的。 緩存
3.在使用Spring作爲容器的系統中,混用JDBCTemplate和Hibernate,事務管理請統一使用HibernateTransactionManager,前提是JDBCTemplate和Hibernate共用一個DataSource. session
那麼,咱們來看看共享事務管理如何配置。
在Spring和Hibernate的配置文件中,咱們能夠對類中的方法進行事務控制,也就是說某個方法中含有多個數據庫的寫操做,咱們能夠經過建立一個Spring中的HibernateTransactionManager實例,把相應的sessionFactory注入到其的sessionFactory屬性中,由事務聲明的方式進行事務控制。樣例以下: 併發
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"><ref bean="sessionFactory"/></property> </bean>
可是這種方式有個侷限性,若是該方法中既有調用Hibernate進行存儲,也有經過JdbcTemplate進行數據庫的寫操做,若是在方法執行過程當中,寫數據發生異常時,只有歸入了事務管理的經過Hibernate進行存儲的數據纔會回滾,而經過JdbcTemplate方式進行操做的數據不會進行回滾。緣由是Hibernate與JdbcTemplate使用的是不一樣DBConnection,並且JdbcTemplate未申明相應的事務管理,因此要想在既使用了Hibernate,也使用了JdbcTemplate進行數據庫存儲操做的方法進行事務管理,須要在Spring的配置文件作適當的修改,樣例以下: mvc
<bean id=" transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"><ref bean="sessionFactory"/></property> <property name="dataSource"><ref bean="oaDataSource"/></property> </bean>
JdbcTemplate和Hibernate能被wrap到同一個事務裏。成立須要幾點條件: app
一、使用同一個datasource; 框架
二、事務交由HibernateTransactionManager管理; 高併發
三、相關dao以及service須要使用runtime exception體系,使用spring提供的exception能夠,本身封裝設計的runtime exception體系也行。
最後,提醒下,在須要事務處理的地方請注意不要寫try-catch,必定要throw出來,事務就靠這個異常回滾呢。以上是以前作共享事務總結的,當時測試是基於Junit,測試經過。如今,項目中用到Flex+Spring,其中就運用了共享事務管理。可是我在使用的時候事務一直就是不生效,後面整了很久,發現了這麼一篇文章《Spring3MVC+Mybatis3.1框架下的事務》http://my.oschina.net/xuqiang/blog/97633:
切面配置在了root applicationContext的bean上了,而spring mvc會根據xxx-servelt.xml生成一個本身的applicationContext,他的父applicationContext爲root applicatonContext,當mvc有本身的bean時便再也不去向父context要bean,致使聲明事務無效。
受到啓發,個人問題與之相似,一樣的,我也這麼去作,最終成功了! 如下是加載flex配置,另外,在applicationContext-flex.xml下面將事務的配置寫進去。
web.xml的配置: <!--========================加載flex配置========================--> <servlet> <servlet-name>flexDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext-flex.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> applicationContext-flex.xml的配置: <!-- 使用annotation定義事務 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- Hibernate 與spring jdbcTemplate共享事物的管理 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> <property name="dataSource" ref="dataSource"/> </bean>