2013-03-07 53 views
-1

我開始學習工具包spring jdbc。在春天閱讀一些關於transactions 的文檔,結束它們的模板。儘管如此,一些常見的事情我不清楚。spring jdbc + PlatformTransactionManager + spring數據+理論

1)如果我們有Spring Data爲什麼總是聽到只有約​​Spring JDBC
Spring框架有一些項目像Spring MVCSpring Security
首先,我試圖找到Spring JDBC春的主站點,但不發現它。而不是我發現Spring Data項目。經過一番研究,我發現Spring Data使用Spring JDBCJDBC Extensions子項目和最後有一些oracle具體操作有什麼有趣的我。我意識到什麼沒有看到或聽到任何使用或看到教程Spring Data參考。這真的很糟糕?

2)我應該創建的JdbcTemplate的新實例每次
其次是JdbcTemplate,有用的模板方法。充滿了像

public class JdbcCorporateEventDao implements CorporateEventDao { 

    private JdbcTemplate jdbcTemplate; 

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

    // JDBC-backed implementations of the methods on the CorporateEventDao follow... 
} 

和代碼示例中的所有文檔也寫文檔JdbcTemplate類的

實例是線程安全的,一旦配置

這是一種誤導。爲什麼在setDataSource方法中他們創建了新的實例,如果他們可以把dataSource放入已創建的實例中,或者我誤解了它?

3)我們如何使用TransactionTemplate編寫複雜的客戶端邏輯是什麼?
TransactionTemplate另一個模板是什麼與TransactionStatus一起使用。據我瞭解,它可以幫助我管理我的交易有多大的幫助? 在execute方法TransactionTemplate的開頭我們有transactionManager.getTransaction(this)。在execute方法末尾,我們有行this.transactionManager.commit(status)。因此,我如何理解它,所有我在doInTransaction方法中的內容都將在單個事務中執行。但是如何在其他方法中使用相同的事務執行其他DAO?它限制了用複雜的邏輯寫客戶端。我的意思是所有的邏輯必須用一種方法?我認爲這不可能是真的。
我的意思是說複雜的邏輯。例如,我有我自己的模板方法。

/*abstract class definition*/ 

public final void execute(){ 
    onPreExec(); 
    exec(); 
    onPostExec(); 
} 

abstract void exec(); //client execute few DAOs methods 

public void onPreExec(){} 

public void onPostExec(){} //commit or rollback transaction in another method 

/*other class members*/ 



4)是線程安全的使用 「PTM」, 「TD」, 「TS」?
此外我開始調查後面的this.transactionManager.commit(status)。這對我來說代表PlatformTransactionManagerTransactionDefinition。我如何理解,在我開始寫這行文字的那一刻,這個類可以幫助我實現第3個問題的目標。例如,我可以這樣做:

/*abstract class definition*/ 

protected PlatformTransactionManager ptm; 
protected TransactionDefinition td; 
protected TransactionStatus ts;//TS with PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED 

public final void execute(){ 
    onPreExec(); 
    exec(); 
    onPostExec(); 
} 

abstract void exec(); //client execute few DAOs methods 

public void onPreExec(){//start transaction 
    ts=ptm.getTransaction(td); 
} 

public void onPostExec(){//end transaction 
    if (exec.wasCompletedSuccessfully()){ 
     dao.markJobCompleted(); //do some for fix execution completeness 
     ptm.commit(ts); 
    } else {ptm.rollback(ts);} 

} 

/*other class members*/ 

至少這看起來比某些情況下transactionTemplate.execute()方法更方便。雖然僅僅分爲幾個部分transactionTemplate.execute()方法。

但仍不清楚它是線程安全的?即我可以使用它,並確保所有來自jdbcTemplateJDBC s callableStatment.execute()方法的內部呼叫都將指向此並且僅限於此交易。並沒有看到其他線程中的另一個事務。

感謝您的閱讀。

回答

1

關於JdbcTemplate的:

JDBC模板由彈簧與數據庫進行交互提供。您可以使用簡單的JDBC代碼來連接數據庫並執行操作,但在這種情況下,您必須處理與連接關閉等相關的問題。Spring jdbc模板處理所有這些問題,最終用戶只需使用這些API並執行操作。

關於新的JDBCTemplate(),我認爲這只是一個例子,即你不需要在每個類中創建jdbc模板對象。您可以像創建數據源一樣創建它的bean,或者爲此創建BaseDAO類。

+0

感謝您對一個問題的回答 – Mrusful 2013-03-07 11:52:13

0

只是還有一件事,請通過Spring Data Support視頻。這些是學習JDBC模板基礎的非常好的視頻。

0

你需要認識到Spring已經存在了11年了。它是演變而來的。已經有許多項目開始作爲春季的輔助項目,並已經融入其中。自從Rod Johnson首次撰寫Spring JDBC以來,Spring JDBC就一直存在。 Spring Data是最近的一個發展。