傳智播客-spring2.5(4)-JDBC與事務

這是傳說中的黎活明老師的課程,該課程網上有免費視頻下載。之前提到的巴巴運動網項目就是黎活明老師一個人一手開發的(巴巴運動網在線首頁),以前是傳智播客的必授課程,現在改爲Android開發課程,還是黎老師授課。Android開發課程視頻因爲考慮到學員就業競爭力和培訓機構之間競爭力的問題,暫不對外公佈,想學習Android 3G開發的話歡迎來傳智播客親自聆聽,而且傳智播客現在特別推出了爲期一週的Android 3G項目課程

 

spring裏集成JDBC
(ms很多框架的很多應用,包括事務,現在都提供註解方式和基於xml配置方式,現在的趨勢是採用註釋方式,極大的改進了開發效率)
使用Spring集成JDBC的步驟如下:
1、配置數據源,如:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
    <!-- 連接池啓動時的初始值 -->
    <property name="initialSize" value="1"/>
    <!-- 連接池的最大值 -->
    <property name="maxActive" value="500"/>
    <!-- 最大空閒值.當經過一個高峯時間後,連接池可以慢慢將已經用不到的連接慢慢釋放一部分,一直減少到maxIdle爲止 -->
    <property name="maxIdle" value="2"/>
    <!--  最小空閒值.當空閒的連接數少於閥值時,連接池就會預申請一些連接,以避免洪峯來時再申請而造成的性能開銷 -->
    <property name="minIdle" value="1"/>
     。。。(略)
</bean>
上面使用了Apache組織的dbcp數據源,我們需要把lib/jakarta-commons下的commons-dbcp.jar和commons-pool.jar加入類路徑下。

 

還可以使用屬性佔位符方式配置數據源:<context:property-placeholder location="jdbc.properties"/>,其中“jdbc.properties”爲類路徑下的屬性文件,然後獲取連接信息時用表達式取值,例如:<property name="driverClassName" value="${driverClassName}"/>,其中${driverClassName}爲屬性文件中的key值。

 

2、配置事務。配置事務時,需要在xml配置文件中引入用於聲明事務的tx命名空間,如下:
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
 (略)
</beans>

spring配置事務可以用註解或xml配置文件方式,但兩者都需要聲明spring的事務管理,如下:
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource"/>
</bean>


具體示例就不寫了。

 

對於傳統的JDBC編程,至少有兩個弊端:一是繁瑣的連接關閉和事務處理代碼,而忘記關閉通常是很多問題的源頭;二是JDBC不提供一個異常層次,而是用拋出SQLException來響應所有錯誤,當出錯要具體排查時不夠方便--要找到諸如是死鎖還是非法的SQL問題需要檢查SQLState的值和錯誤碼,而這些值隨着數據庫的不同而不同。

 

而spring的解決方案是:一、將那些繁瑣的代碼封裝到框架中,而我們開發時就可以集中精力在編寫恰當的SQL和提取結果上;二、spring自定義的一套有層次的異常處理,而且這些異常並不是JDBC所特有的(關於spring與jdbc更多的知識請參見滿江紅譯文《SpringFramework概述》)。

 

關於JDBC入門到詳解的知識可以下載傳智播客的網上免費視頻JDBC課程:)

 

理解spring裏的事務
1、通過一個類似JDBCTemplate的回調模板(例如org.springframework.jdbc.core包下的JdbcTemplate類,自帶有CRUD操作方法)來實現可編程的事務管理。

 

2、spring裏可以採用@Transactional註解方式聲明事務,而其事務傳播屬性有以下幾種:
(1)REQUIRED:業務方法需要在一個事務中運行。如果方法運行時,已經處在一個事務中,那麼加入到該事務,否則爲自己創建一個新的事務。
(2)NOT_SUPPORTED:聲明方法不需要事務。如果方法沒有關聯到一個事務,容器不會爲它開啓事務。如果方法在一個事務中被調用,該事務會被掛起,在方法調用結束後,原先的事務便會恢復執行。
(3)REQUIRESNEW:屬性表明不管是否存在事務,業務方法總會爲自己發起一個新的事務。如果方法已經運行在一個事務中,則原有事務會被掛起,新的事務會被創建,直到方法執行結束,新事務纔算結束,原先的事務纔會恢復執行。
(4)MANDATORY:該屬性指定業務方法只能在一個已經存在的事務中執行,業務方法不能發起自己的事務。如果業務方法在沒有事務的環境下調用,容器就會拋出例外。
(5)SUPPORTS:這一事務屬性表明,如果業務方法在某個事務範圍內被調用,則方法成爲該事務的一部分。如果業務方法在事務範圍外被調用,則方法在沒有事務的環境下執行。
(6)NEVER:指定業務方法絕對不能在事務範圍內執行。如果業務方法在某個事務中執行,容器會拋出例外,只有業務方法沒有關聯到任何事務,才能正常執行。
(7)NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按REQUIRED屬性執行.它使用了一個單獨的事務, 這個事務擁有多個可以回滾的保存點。內部事務的回滾不會對外部事務造成影響。它只對DataSourceTransactionManager事務管理器起效。
spring的事務管理借鑑了ejb的事務管理方式,上述幾種傳播方式中前六種ejb也有,最後一種則是spring獨有的。

 

3、默認情況下,spring不對拋出Checked Exception(例如在方法上顯示聲明拋出的Exception)的事務回滾,只對unChecked Exception回滾,但是可以用@Transactional(RollbackFor)更改。

 

關於spring事務更多的知識請參見滿江紅譯文《SpringFramework概述》或者來傳智播客親自聆聽:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章