2011-07-02 65 views
2

Spring Framework提供了兩種編程事務管理方式:TransactionTemplate vs JdbcTemplate

1)使用TransactionTemplate。

2)直接使用PlatformTransactionManager實現。

高於在http://static.springsource.org/spring/docs/2.0.8/reference/transaction.html

春網站已經不再贅述JDBC模板被提及。根據我的理解,jdbc模板也在內部管理事務,並且這也都在程序中完成。那麼 TransactionTemplate和jdbc tempalte之間的基本差異是什麼。

+3

你需要停止讀取春手工的古老的版本。 2.0.x已經有幾年了。 – skaffman

+0

我應該查看哪些最新版本? –

+0

3.0.5是最新的穩定版 – abalogh

回答

17

JdbcTemplate不是交易管理器。它僅僅是本地JDBC操作的幫助類:

這是JDBC核心包中的中心類。它簡化了JDBC的使用,並有助於避免常見錯誤。它執行核心JDBC工作流程,使應用程序代碼提供SQL並提取結果。此類執行SQL查詢或更新,啓動對ResultSets的迭代並捕獲JDBC異常,並將它們轉換爲org.springframework.dao包中定義的通用,更具信息性的異常層次結構。

TransactionTemplate的方式也不是一個事務管理器,它是一個

模板類,它簡化了程序性事務界定和交易異常處理。

PlatformTransactionManager(的AbstractPlatformTransactionManager和其它子類)是一個事務管理器,如在它

  • 確定是否存在的現有事務;
  • 應用適當的傳播行爲;
  • 必要時暫停和恢復交易;
  • 檢查提交時的僅回滾標誌;
  • 在回滾中應用適當的修改(實際回滾或僅設置回滾);
  • 觸發器註冊同步回調(如果事務同步處於活動狀態)。

所以這個類是負責實際事務處理,而不是在TransactionTemplate,這是你,而不是聲明式事務處理要programmetically實現它使用。 (請參閱this博客,儘管相當過時,但您會看到聲明式和手動式之間的區別)

來自Spring 3 Reference的引文。

注意:在整個Spring框架中,您還可以找到其他* Template類:HibernateTemplate,JmsTemplate等等。它們都遵循相同的模式:模板類從根本上減少了需要編寫的代碼量,因爲所有所謂的樣板代碼將由他們處理。示例(從here):

沒有JdbcTemplate

private DataSource dataSource; 

public void setDataSource(DataSource dataSource) { 
    this.dataSource = dataSource; 
} 

public void insert(Customer customer){ 

    String sql = "INSERT INTO CUSTOMER " + 
      "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)"; 
    Connection conn = null; 

    try { 
     conn = dataSource.getConnection(); 
     PreparedStatement ps = conn.prepareStatement(sql); 
     ps.setInt(1, customer.getCustId()); 
     ps.setString(2, customer.getName()); 
     ps.setInt(3, customer.getAge()); 
     ps.executeUpdate(); 
     ps.close(); 

    } catch (SQLException e) { 
     throw new RuntimeException(e); 

    } finally { 
     if (conn != null) { 
      try { 
       conn.close(); 
      } catch (SQLException e) {} 
     } 
    } 
} 

而且隨着JdbcTemplate

private DataSource dataSource; 
private JdbcTemplate jdbcTemplate; 

public void setDataSource(DataSource dataSource) { 
    this.dataSource = dataSource; 
} 

public void insert(Customer customer){ 

    String sql = "INSERT INTO CUSTOMER " + 
     "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)"; 

    jdbcTemplate = new JdbcTemplate(dataSource); 

    jdbcTemplate.update(sql, new Object[] { customer.getCustId(), 
     customer.getName(),customer.getAge() 
    }); 

} 
+0

感謝abalogh。如果我們不使用帶有Jdbc模板的transactionManager和Transaction模板,則在每種方法中將交易 。對?但是,如果我們將TransactionManager和Transaction模板與JDBc模板一起使用,並且 PROPAGATION_REQUIRED,那麼當它退出主調用方法時,trnsaction將被提交。是否 正確? –