我開始學習工具包spring jdbc
。在春天閱讀一些關於transactions 的文檔,結束它們的模板。儘管如此,一些常見的事情我不清楚。spring jdbc + PlatformTransactionManager + spring數據+理論
1)如果我們有Spring Data
爲什麼總是聽到只有約Spring JDBC
Spring框架有一些項目像Spring MVC
,Spring Security
等
首先,我試圖找到Spring JDBC
春的主站點,但不發現它。而不是我發現Spring Data
項目。經過一番研究,我發現Spring Data
使用Spring JDBC
JDBC 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)
。這對我來說代表PlatformTransactionManager
和TransactionDefinition
。我如何理解,在我開始寫這行文字的那一刻,這個類可以幫助我實現第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()
方法。
但仍不清楚它是線程安全的?即我可以使用它,並確保所有來自jdbcTemplate
的JDBC
s callableStatment.execute()
方法的內部呼叫都將指向此並且僅限於此交易。並沒有看到其他線程中的另一個事務。
感謝您的閱讀。
感謝您對一個問題的回答 – Mrusful 2013-03-07 11:52:13